Remus'un dediği gibi iş yükünüze bağlıdır.
Yine de kabul edilen cevabın yanıltıcı bir yönünü ele almak istiyorum.
Dizindeki tüm sütunlarda eşitlik araması yapan sorgular için önemli bir fark yoktur.
Aşağıdaki iki tablo oluşturur ve bunları aynı verilerle doldurur. Tek fark, anahtarların en çokdan en az seçiciye, diğerinin tersine doğru sıralanmasıdır.
CREATE TABLE Table1(MostSelective char(800), SecondMost TINYINT, Least CHAR(1), Filler CHAR(4000) null);
CREATE TABLE Table2(MostSelective char(800), SecondMost TINYINT, Least CHAR(1), Filler CHAR(4000) null);
CREATE NONCLUSTERED INDEX MyINDX on Table1(MostSelective,SecondMost,Least);
CREATE NONCLUSTERED INDEX MyINDX2 on Table2(Least,SecondMost,MostSelective);
INSERT INTO Table1 (MostSelective, SecondMost, Least)
output inserted.* into Table2
SELECT TOP 26 REPLICATE(CHAR(number + 65),800), number/5, '~'
FROM master..spt_values
WHERE type = 'P' AND number >= 0
ORDER BY number;
Şimdi her iki tabloya karşı bir sorgu yapıyor ...
SELECT *
FROM Table1
WHERE MostSelective = REPLICATE('P', 800)
AND SecondMost = 3
AND Least = '~';
SELECT *
FROM Table2
WHERE MostSelective = REPLICATE('P', 800)
AND SecondMost = 3
AND Least = '~';
... Her ikisi de bir endeks cezası kullanır ve her ikisine de aynı maliyet verilir.
Kabul edilen cevaptaki ASCII sanatı aslında indekslerin nasıl yapılandırıldığı değildir. Tablo1 için dizin sayfaları aşağıda gösterilmiştir (tam boyutta açmak için resme tıklayın).
Dizin sayfaları, tüm anahtarı içeren satırları içerir (bu durumda, dizin benzersiz olarak bildirilmediğinden, ancak bu konu hakkında daha fazla bilgi göz ardı edilebildiğinden satır tanımlayıcı için ek bir anahtar sütun eklenir ).
Yukarıdaki sorgu için SQL Server sütunların seçiciliği umurumda değil. Kök sayfanın ikili bir aramasını yapar ve Anahtarın (PPP...,3,~ )
olduğunu >=(JJJ...,1,~ )
ve < (SSS...,3,~ )
bu yüzden de sayfayı okuması gerektiğini keşfeder 1:118
. Daha sonra, o sayfadaki anahtar girişleri ikili olarak arar ve aşağıya gidilecek yaprak sayfasını bulur.
Dizini seçicilik sırasına göre değiştirmek, ikili aramadan beklenen anahtar karşılaştırma sayısını veya dizin araması yapmak için yönlendirilmesi gereken sayfa sayısını etkilemez. En iyisi olabilir marjinal anahtar karşılaştırma kendisi hızlandırmak.
Bazen en seçici dizini sipariş etmek, iş yükünüzdeki diğer sorgular için anlamlı olur.
Örneğin, iş yükü aşağıdaki formların her ikisinin de sorgularını içeriyorsa.
SELECT * ... WHERE MostSelective = 'P'
SELECT * ...WHERE Least = '~'
Yukarıdaki dizinler hiçbirini kapsamaz. MostSelective
değerli bir arama ve arama ile bir plan yapmak için yeterince seçicidir, ancak karşı sorgu Least
değildir.
Ancak bu senaryo (bir bileşik dizinin önde gelen sütun (lar) ının alt kümesinde kapsayıcı olmayan dizin araması), bir dizin tarafından yardımcı olabilecek olası bir sorgu sınıfıdır. Asla MostSelective
kendi başına ya da MostSelective, SecondMost
her üç sütunun bir kombinasyonuyla arama yapmazsanız ve bu teori avantajı sizin için işe yaramazsa.
Tersine sorgular gibi
SELECT MostSelective,
SecondMost,
Least
FROM Table2
WHERE Least = '~'
ORDER BY SecondMost,
MostSelective
Sıkça reçete edilenin ters sırasına sahip olmak yardımcı olacaktır - sorguyu kapsadığı için, bir aramayı destekleyebilir ve satırları önyükleme için istenen sırada döndürür.
Bu tavsiye bir sıklıkla tekrarlanan parçasıdır ama en azından potansiyel yararı hakkında bir sezgisel var Yani diğer sorguları - ve aslında bakarak yerine geçmez senin iş yükü.