INCLUDEAnahtarda bu sütuna ihtiyacınız yoksa , anahtar sütunları tercih etmenin bir nedeni de belgelerdir. Bu, gelişen endeksleri gelecekte çok daha kolay hale getiriyor.
Örneğiniz düşünüldüğünde:
CREATE INDEX idx1 ON MyTable (Col1) INCLUDE (Col2, Col3)
Sorgunuz şöyle görünüyorsa bu dizin en iyisidir:
SELECT col2, col3
FROM MyTable
WHERE col1 = ...
Tabii ki INCLUDE, anahtar parçalara sahip olmaktan ek bir fayda elde edebiliyorsanız , sütunları koymamalısınız. Aşağıdaki sorguların her ikisi de aslında col2dizinin anahtarındaki sütunu tercih eder .
SELECT col2, col3
FROM MyTable
WHERE col1 = ...
AND col2 = ...
SELECT TOP 1 col2, col3
FROM MyTable
WHERE col1 = ...
ORDER BY col2
En şudur varsayalım değil durum ve sahip olduğumuz col2içinde INCLUDEendeksinin ağaç kesiminde böyle bir çözüme sahip sadece hayır faydası olduğundan maddesi.
Birkaç yıl ileri git.
Bu sorguyu ayarlamanız gerekiyor:
SELECT TOP 1 col2
FROM MyTable
WHERE col1 = ...
ORDER BY another_col
Bu sorguyu optimize etmek için aşağıdaki dizin harika olur:
CREATE INDEX idx1 ON MyTable (Col1, another_col) INCLUDE (Col2)
Bu tabloda zaten hangi dizinlerin bulunduğunu kontrol ederseniz, önceki dizininiz hala orada olabilir:
CREATE INDEX idx1 ON MyTable (Col1) INCLUDE (Col2, Col3)
Şimdi bunu biliyorsunuz Col2ve Col3dizin ağacının bir parçası değilsiniz ve bu nedenle okuma dizin aralığını daraltmak veya satırları sıralamak için kullanılmıyor. another_columnDizinin anahtar bölümünün sonuna eklemek oldukça güvenlidircol1 ) . Herhangi bir şeyi kırma riski çok azdır:
DROP INDEX idx1 ON MyTable;
CREATE INDEX idx1 ON MyTable (Col1, another_col) INCLUDE (Col2, Col3);
Bu endeks daha da büyüyecek ve hala bazı riskleri var, ancak mevcut endeksleri yenilerini tanıtmaya kıyasla genişletmek genellikle daha iyidir.
Olmadan bir dizine sahip olsaydınız, hemen ardından INCLUDEekleyerek hangi sorguları kıracağınızı bilemezdiniz .another_colCol1
CREATE INDEX idx1 ON MyTable (Col1, Col2, Col3)
Eklemek ne olur another_colarasında Col1veCol2 ? Diğer sorgular acı çekecek mi?
Bu sütunları tablodan getirmekten kaçınmak için eklerseniz,INCLUDE anahtar sütunlara karşı diğer "avantajları" vardır . Ancak, dokümantasyon yönünü en önemlisi olarak görüyorum.
Soruna cevap vermek için:
INCLUDE yan tümcesi olan veya olmayan bir kaplama dizini oluşturulup oluşturulmayacağını belirlemede hangi yönergeleri önerirsiniz?
Yalnızca sütunu, dizini tabloyu ziyaret etmeden dizinde kullanabilmek amacıyla dizine bir sütun eklerseniz, onu INCLUDEyan tümceye yerleştirin.
Sütunu dizin anahtarına eklemek ek yararlar getirirse (örneğin order by, okunan dizin aralığını daraltabileceği için veya bu anahtar için) anahtarı ekleyin.
Bununla ilgili daha uzun bir tartışmayı buradan okuyabilirsiniz:
https://use-the-index-luke.com/blog/2019-04/include-columns-in-btree-indexes