Salah satu alasan untuk lebih memilih INCLUDE
daripada kolom-kunci jika Anda tidak membutuhkan kolom dalam kunci adalah dokumentasi. Itu membuat indeks yang berkembang jauh lebih mudah di masa depan.
Mempertimbangkan contoh Anda:
CREATE INDEX idx1 ON MyTable (Col1) INCLUDE (Col2, Col3)
Indeks itu yang terbaik jika kueri Anda terlihat seperti ini:
SELECT col2, col3
FROM MyTable
WHERE col1 = ...
Tentu saja Anda tidak boleh memasukkan kolom INCLUDE
jika Anda bisa mendapatkan manfaat tambahan dari menempatkannya di bagian kunci. Kedua pertanyaan berikut sebenarnya akan lebih suka col2
kolom di kunci indeks.
SELECT col2, col3
FROM MyTable
WHERE col1 = ...
AND col2 = ...
SELECT TOP 1 col2, col3
FROM MyTable
WHERE col1 = ...
ORDER BY col2
Mari kita asumsikan ini tidak terjadi dan kita miliki col2
dalam INCLUDE
klausa karena tidak ada untungnya memiliki di bagian pohon indeks.
Maju cepat beberapa tahun.
Anda perlu menyetel kueri ini:
SELECT TOP 1 col2
FROM MyTable
WHERE col1 = ...
ORDER BY another_col
Untuk mengoptimalkan kueri itu, indeks berikut akan bagus:
CREATE INDEX idx1 ON MyTable (Col1, another_col) INCLUDE (Col2)
Jika Anda memeriksa indeks apa yang sudah Anda miliki di tabel itu, indeks Anda sebelumnya mungkin masih ada:
CREATE INDEX idx1 ON MyTable (Col1) INCLUDE (Col2, Col3)
Sekarang Anda tahu itu Col2
dan Col3
bukan bagian dari pohon indeks dan karenanya tidak digunakan untuk mempersempit rentang indeks baca atau untuk memesan baris. Is agak aman untuk ditambahkan another_column
ke akhir bagian kunci indeks (setelah col1
). Ada sedikit risiko untuk memecahkan apa pun:
DROP INDEX idx1 ON MyTable;
CREATE INDEX idx1 ON MyTable (Col1, another_col) INCLUDE (Col2, Col3);
Indeks itu akan menjadi lebih besar, yang masih memiliki beberapa risiko, tetapi umumnya lebih baik memperpanjang indeks yang sudah ada dibandingkan dengan memperkenalkan yang baru.
Jika Anda akan memiliki indeks tanpa INCLUDE
, Anda tidak bisa tahu permintaan apa yang akan Anda pecahkan dengan menambahkan another_col
setelahnya Col1
.
CREATE INDEX idx1 ON MyTable (Col1, Col2, Col3)
Apa yang terjadi jika Anda menambahkan another_col
antara Col1
dan Col2
? Apakah pertanyaan lain akan terganggu?
Ada "manfaat" lain dari INCLUDE
kolom kunci vs. jika Anda menambahkan kolom itu hanya untuk menghindari mengambilnya dari tabel . Namun, saya menganggap aspek dokumentasi yang paling penting.
Untuk menjawab pertanyaan Anda:
pedoman apa yang akan Anda sarankan dalam menentukan apakah akan membuat indeks penutup dengan atau tanpa klausa INCLUDE?
Jika Anda menambahkan kolom ke indeks untuk tujuan tunggal agar kolom itu tersedia dalam indeks tanpa mengunjungi tabel, masukkan ke dalam INCLUDE
klausa.
Jika menambahkan kolom ke kunci indeks membawa manfaat tambahan (misalnya untuk order by
atau karena itu dapat mempersempit rentang indeks baca) menambahkannya ke kunci.
Anda dapat membaca diskusi yang lebih panjang tentang ini di sini:
https://use-the-index-luke.com/blog/2019-04/include-columns-in-btree-indexes