Belirli çoklu sütun dizinleri yerine, birçok tek alan dizini kullanmalı mıyım?


35

Bu soru, bir SQL Server endeksleme tekniğinin etkinliği hakkındadır. Bence "endeks kesişimi" olarak bilinir

Bazı performans ve kararlılık sorunları olan varolan bir SQL Server (2008) uygulamasıyla çalışıyorum. Geliştiriciler indeksleme ile bazı garip şeyler yaptılar. Bu konularda kesin kriterler elde edemedim ya da internette gerçekten iyi bir belge bulamıyorum.

Bir masada aranabilir sütunlar var. Geliştiriciler, aranabilir sütunların EACH’inde tek bir sütun dizini oluşturdular. Teori, SQL Server'ın çoğu durumda tabloya verimli bir şekilde erişmek için bu indekslerin her birini birleştirebileceği (kesiştiği) idi . İşte basitleştirilmiş bir örnek (gerçek tablo daha fazla alana sahip):

CREATE TABLE [dbo].[FatTable](
    [id] [bigint] IDENTITY(1,1) NOT NULL,
    [col1] [nchar](12) NOT NULL,
    [col2] [int] NOT NULL,
    [col3] [varchar](2000) NOT NULL, ...

CREATE NONCLUSTERED INDEX [IndexCol1] ON [dbo].[FatTable]  ( [col1] ASC )
CREATE NONCLUSTERED INDEX [IndexCol2] ON [dbo].[FatTable] ( [col2] ASC )

select * from fattable where col1 = '2004IN' 
select * from fattable where col1 = '2004IN' and col2 = 4

Arama kriterlerini hedefleyen birden fazla sütun indeksinin çok daha iyi olduğunu düşünüyorum, ancak hatalı olabilirim. SQL Server'ın iki dizin aramada bir karma eşleşmesi yaptığını gösteren sorgu planları gördüm. Belki de masanın nasıl arandığını bilmediğinizde anlamlıdır? Teşekkürler.


@brentozar izlemeye değer endekslerle ilgili güzel bir video var: brentozar.com/sql-server-training-videos/…
DForck42

Yanıtlar:


38

Eğer edilmektedir gerekenler kapsayan yani endeksleri. bir sorguyu kendi kendine karşılayabilecek endeksler. Ancak bir 'örtme' endeksinin bir sorunu var: belirli bir sorguyu kapsıyor . Bu nedenle, iyi bir indeksleme stratejisi geliştirmek için, iş yükünüzü anlamalısınız: hangi sorguların veritabanına çarptığı, hangilerinin kritik ve hangilerinin olmadığı, hangi sorguların ne sıklıkta yapıldığı, vb. Bunu, her bir endeksin yazma ve güncelleme maliyetine karşı dengeleyin; burada indeksleme stratejiniz var. Biraz karışık sesler bunun nedeni olduğunu edilir karmaşık.

Ancak bazı kurallar uygulayabilirsiniz. MSDN, temellerini oldukça iyi kapsar:

Ayrıca, toplumun katkıda bulunduğu sayısız makale vardır, örneğin. Web Yayını Kaydı - DBA Darwin Ödülleri: Index Edition .

Ve özellikle soruna cevap vermek gerekirse: Her sütun üzerinde ayrı endeksler kutu çalışması, her sütun bir olması koşuluyla yüksek seçiciliğe (birçok farklı değerleri, veritabanında sadece birkaç kez görünen her değerleri). İki dizin aralığı taraması arasında karma birleşimi kullanan sonuç erişim planı genellikle oldukça iyi çalışır. Seçiciliği düşük sütunlar (birkaç farklı değer, veritabanında birçok kez görünen her değer), kendi başlarına dizine alınmanın bir anlamı yoktur, sorgu en iyi duruma getiricisi bunları yalnızca yok sayar. Ancak, düşük seçicilik sütunları birçok kez yüksek seçicilik sütunu ile eşlendiklerinde iyi bileşik tuşlar oluşturur.


Teşekkürler Remus. Ayrı endeksleri kullanarak, hedefli çoklu sütun indeksleri (ve içerir) yaratmanın göreceli avantajını merak ediyorum. "Oldukça iyi çalışıyor" yeterince iyi ise, sorun olmayabilir. (Düşük seçiciliğe sahip alanlarda indeksleri atacak). Bu teknik üretim veritabanına erişimimiz olmadığında yardımcı olmalı ve endekslerimizi gerçek kullanıma hedefleyemediğinde yardımcı olmalıdır.
RaoulRubin
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.