INCLUDE
Anahtarda 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 col2
dizinin 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 col2
içinde INCLUDE
endeksinin 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 Col2
ve Col3
dizin 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_column
Dizinin 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 INCLUDE
ekleyerek hangi sorguları kıracağınızı bilemezdiniz .another_col
Col1
CREATE INDEX idx1 ON MyTable (Col1, Col2, Col3)
Eklemek ne olur another_col
arasında Col1
veCol2
? 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 INCLUDE
yan 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