Salah satu alasan untuk lebih memilih INCLUDEdaripada 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 INCLUDEjika Anda bisa mendapatkan manfaat tambahan dari menempatkannya di bagian kunci. Kedua pertanyaan berikut sebenarnya akan lebih suka col2kolom 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 col2dalam INCLUDEklausa 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 Col2dan Col3bukan bagian dari pohon indeks dan karenanya tidak digunakan untuk mempersempit rentang indeks baca atau untuk memesan baris. Is agak aman untuk ditambahkan another_columnke 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_colsetelahnya Col1.
CREATE INDEX idx1 ON MyTable (Col1, Col2, Col3)
Apa yang terjadi jika Anda menambahkan another_colantara Col1dan Col2? Apakah pertanyaan lain akan terganggu?
Ada "manfaat" lain dari INCLUDEkolom 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 INCLUDEklausa.
Jika menambahkan kolom ke kunci indeks membawa manfaat tambahan (misalnya untuk order byatau 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