Bu dizin oluşturmak, mevcut dizin yeni dizindeki tüm sütunları içerdiğinde performansı neden bu kadar artırdı?


19

Log ve LogItem tablolarım var; Her ikisinden de bazı verileri almak için bir sorgu yazıyorum. Binlerce var Logsve her biri Log125'e kadar sahip olabilirLogItems

Söz konusu sorgu karmaşıktır, bu yüzden onu atlıyorum (birisi önemli olduğunu söyleyebilirim muhtemelen gönderebilirim), ancak SSMS Tahmini Sorgu planını çalıştırdığımda, yeni bir Kümelenmemiş dizin performansı% 100'e kadar artıracağını söyledi .

Existing Index: Non-clustered
Key Colums (LogItem): ParentLogID, DateModified, Name, DatabaseModified

Query Plan Recommendation
CREATE NONCLUSTERED INDEX [LogReportIndex]
ON [dbo].[LogItem] ([ParentLogID],[DatabaseModified])

Sadece eğlence için, bu yeni dizini oluşturdum ve sorguyu çalıştırdım ve çok şaşırdım, şimdi 10 saniyeden önce sorgumun çalışması için ~ 1 saniye sürüyor.

Mevcut dizinimi bu yeni sorguyu kapsayacağını varsaydım, bu yüzden sorum şu: Neden yeni sorgumda kullanılan sütunlarda yeni bir dizin oluşturmak performansı artırdı? Cümlelerimde kullanılan her bir benzersiz sütun birleşimi için bir dizin oluşturmalı mıyım where?

Not: Bunun SQL Server'ın sonuçlarımı önbelleğe alması nedeniyle olduğunu düşünmüyorum, dizini oluşturmadan önce sorguyu yaklaşık 25-30 kez çalıştırdım ve sürekli olarak 10-15 saniye sürdü, dizinden sonra artık tutarlı bir şekilde ~ 1 veya daha az.


Kümelenmemiş ek dizin oluşturmadan önce, gerçek yürütme planı dizin kullanımı için neyi gösterdi?
Thomas Stringer

% 100 iyileştirilmiş performans nedir?

@Shark Güzel soru, emin değilim. Bu benim ilk performans hata ayıklama durumum. Bunu ileriye taşıyacağımdan emin olacağım. Tek söylediği 'Eksik dizin' ve hangi alanların olduğu.

@JeffO SSMS'nin söylediği buydu: "Sorgu İşlemcisi, aşağıdaki dizinin uygulanmasının sorgu maliyetini% 100 artırabileceğini tahmin ediyor."

Yanıtlar:


21

Bir dizindeki sütunların sırası önemlidir. Filtreleme, dizinden sütun 1 ve 4'ü gerektiriyorsa dizin yardımcı olmaz. Yalnızca ilk N ardışık sütuna göre filtreleme yaparken kullanışlıdır.

Çünkü dizin bir ağaçtır. Sen verimli nerede ağacın bütün düğümlerin seçemezsiniz column3 = somethingonlar yer diğer tüm dağınık çünkü farklı değerlerine ait, column1ve column2. Ama biliyor column1ve column2aynı zamanda, ağaçta doğru dalı bulmak hiç de kolay değil.


O zaman (genel olarak) bu tabloya çarpacak "nerede" yan tümceleri kümesi için bir dizin gerekir varsayalım güvenli olurdu?

Bir kez sadece uygun sırada dizini kullandığından emin olarak başkasının sorgulama büyük bir hızlandırma yaptım.

1
@Doğal Geniş, evet. Bazı wheres'ler çakışabilir, bu nedenle birkaç wheres'yi güzel bir şekilde kapsayan bir dizin olabilir ; veya wherebelirli bir sütunda endeksleme zaten yardımcı olmayacağından bir cümlenin bir kısmını göz ardı edebilirsiniz (düşük seçicilik); ama genel olarak evet.

@Nate Gerekenden daha fazla dizine sahip olmak istemiyorsunuz. SQL'in sahip olması gereken her dizin kendi başına ek yük ekler. WHERE yan tümcelerinizi mevcut bir dizindeki ilk N sütunla eşleşecek şekilde yeniden düzenleyebiliyorsanız, ek dizin eklemeden sizi çok yaklaştırmanız gerekir.
O Chuck Guy

1
@ChuckBlumreich Cümlelerde sütun sırası whereönemli değildir. Sunucu her zaman mevcut dizinleri en iyi şekilde kullanacak şekilde düzenler. Bu sadece whereilk sütun olarak gerekli tüm sütunları içeren bir indeks olması sorunudur .

12

Öncü bir dizinin önemli olan.

Sorgunuz bir dizinin ön kenarı tarafından "kapsanırsa" etkili olur. Veritabanı indeksleri tipik olarak B-Ağaçları olarak uygulanır ve B-Ağacının yapısı, aramanın belirli bir sırada yapılması gerektiğini belirtir, bu nedenle bileşik endeksteki alanların sırası önemlidir.

Eğer "delikler" varsa, örneğin üzerinde arama yaparsanız ParentLogIDve DatabaseModifiedsadece indeksiniz varsa, indeksin {ParentLogID, DateModified, Name, DatabaseModified}sadece bir {ParentLogID}kısmı verimli bir şekilde kullanılabilir.

(NOT: Bazı DBMS'ler, {DatabaseModified}bölümü "taramayı atla" yoluyla kullanabilir , ancak DBMS'niz normal dizin erişiminden çok daha az verimli olsa bile) .


Eğer varsa Columns (a, b, c, d, e, f)ve en çok sorgu iyi bir ... WHERE A IN(...) AND B = 3dizin benim dizin Index(a,b,c,d)ise, ama ben sahip olsaydım yardımcı olmaz, ... WHERE A IN (...) AND D = 5bu yüzden yaptığım yeni dizin benim Index(a,d)performans çok gelişmiş, değil mi?

8
@Doğru - doğru. Bir telefon defteri gibi düşün. Sadece birinin adını biliyorsanız, Soyadı, Adı
JNK
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.