Çoklu Dizinler ve Çok Sütunlu Dizinler


645

Sadece SQL Server 2005'te bir tabloya bir Dizin ekliyorum ve beni düşündürdü. 1 dizin oluşturmak ve dizine eklemek istediğiniz sütun başına 1 dizine sahip birden çok sütun tanımlamak arasındaki fark nedir?

Birinin diğerinin üzerinde kullanılması için belirli nedenler var mı?

Örneğin

Create NonClustered Index IX_IndexName On TableName
(Column1 Asc, Column2 Asc, Column3 Asc)

Karşı

Create NonClustered Index IX_IndexName1 On TableName
(Column1 Asc)

Create NonClustered Index IX_IndexName2 On TableName
(Column2 Asc)

Create NonClustered Index IX_IndexName3 On TableName
(Column3 Asc)

Yanıtlar:


319

Cade Roux'a katılıyorum .

Bu makale sizi doğru yola yönlendirmelidir:

Dikkat edilmesi gereken bir nokta, kümelenmiş dizinlerin ilk sütun olarak benzersiz bir anahtarı (tavsiye edeceğim bir kimlik sütunu) olması gerekir. Temel olarak, verilerinizin dizinin sonuna eklenmesine yardımcı olur ve çok fazla disk G / Ç ve Sayfa bölünmesine neden olmaz.

İkincisi, verileriniz üzerinde başka dizinler oluşturuyorsanız ve bunlar akıllıca oluşturulmuşsa, yeniden kullanılabilirler.

örneğin, üç sütunda bir tablo aradığınızı hayal edin

eyalet, ilçe, posta kodu.

  • bazen yalnızca eyalet bazında arama yaparsınız.
  • bazen eyalet ve ilçeye göre arama yaparsınız.
  • eyalet, ilçe, posta kodu ile sık sık arama yaparsınız.

Sonra devlet, ilçe, zip ile bir dizin. bu aramaların üçünde de kullanılacaktır.

Zip ile tek başına çok fazla arama yaparsanız, zip, bu dizinin üçüncü bölümü olduğundan ve sorgu iyileştirici bu dizini yararlı olarak görmeyeceğinden, yukarıdaki dizin (zaten SQL Server tarafından) kullanılmayacaktır.

Daha sonra, yalnızca Zip üzerinde bu örnekte kullanılacak bir dizin oluşturabilirsiniz.

Bu arada , Çok Sütunlu indeksleme ile ilk indeks sütununun arama için her zaman kullanılabilir olması ve sadece 'durum' ile arama yaptığınızda verimli ancak yine de 'durumundaki Tek Sütun indeksi kadar verimli olmamasından yararlanabiliriz. '

Aradığınız cevabın, sık kullandığınız sorguların nerede bulunduğuna ve grubunuza göre değiştiğidir.

Makale çok yardımcı olacak. :-)


2
Öyleyse yapılacak en iyi şey, her sütun için ayrı bir dizine ek olarak eyalet, ilçe ve posta kodu için bir dizin tanımlamak mıdır?
Maxim Zaslavsky

12
@jball Burada bir şey mi eksik? Makale çoğunlukla SQL Server sürüm sınırlamaları arasındaki farklarla ilgili gibi görünüyor. Makale taşınmış olabilir mi?
Ian R. O'Brien

@ 4 yıl önce orijinal bağlantıyı çözdüğümden beri 3 yıl içinde bir şey kaybolmuş gibi görünüyor. Blog yazısının evilhomer tarafından bağlandığı gibi doğru başlığa sahip olduğunu söyleyebilirim, ancak dizideki takip blog'larının artık bu ilk gönderiden kolayca bulunamaz gibi görünüyor. Dizideki diğerlerini açıp açamayacağınızı görmek için Kimberly'nin blog arşivinde dolaşmanız gerekecek.
jball

1
1) "Temel olarak [Önce KİMLİKLE Kümelenmiş Dizin sütunu], dizinin sonuna veri eklemenize yardımcı olur" doğrudur. "ve çok fazla disk GÇ ve Sayfa bölünmesine neden olmaz" çok kullanıcılı bir sistemde tamamen yanlıştır. Gerçek şu ki, çok kullanıcılı bir sistemde yüksek çekişmeyi (düşük eşzamanlılık) garanti eder . 2) Kümelenmiş dizin bir İlişkisel Anahtar olmalıdır, yani. değil bir IDENTITY, GUID, etc. 3) "Bu aramaların üçünde eyalet, ilçe, posta kodu içeren bir dizin kullanılacaktır." yanlıştır ve "ilk sütun kullanılabilir" ile çelişir. Dizindeki 2. ve subs sütunları arama için kullanılamaz.
PerformanceDBA

82

Evet. Kimberly Tripp'in indeksleme ile ilgili makalelerine göz atmanızı tavsiye ederim .

Bir dizin "kapsayıcı" ise, dizin dışında bir şey kullanmaya gerek yoktur. SQL Server 2005'te, dizine anahtarın parçası olmayan ve satırın geri kalanına yapılan gezileri ortadan kaldırabilecek ek sütunlar da ekleyebilirsiniz.

Birden çok dizine sahip olmak, tek bir sütunda her biri yalnızca bir dizinin kullanıldığı anlamına gelebilir - farklı dizin oluşturma şemalarının hangi efektleri sunduğunu görmek için yürütme planına başvurmanız gerekir.

Ayarlama sihirbazını, hangi dizinlerin belirli bir sorgu veya iş yükünün en iyi performansı göstermesini sağlamaya yardımcı olması için de kullanabilirsiniz.


7
Kimberly Tripp neden bahsettiğini biliyor. Onunla konuşuyordum ve bu şeyleri içten dışa biliyor. Harika tavsiye.
evilhomer

@CadeRoux Çoğu zaman benim nerede yan tümce '&' ilişkisinde 2 sütun varsa, her ikisinde de çok sütunlu bir dizin veya her ikisinde de tek sütun dizini olması daha iyi olur
bir tuzak

2
@RachitGupta Her iki sütunlu bir dizin
Cade Roux

41

Çok sütunlu dizin, tüm sütunlara referans veren sorgular için kullanılabilir :

SELECT *
FROM TableName
WHERE Column1=1 AND Column2=2 AND Column3=3

Bu doğrudan çok sütunlu indeks kullanılarak aranabilir. Öte yandan, tek sütunlu dizinden en çok biri kullanılabilir (Sütun1 = 1 olan tüm kayıtları aramak ve sonra bunların her birinde Sütun2 ve Sütun3'ü kontrol etmek gerekir).


24
Doğru. Bununla birlikte, bu sütunların her birinin tek bir dizin olarak olması, her şeyi önemli ölçüde hızlandırır. Genellikle sütunlardaki değerlerden biri, elde edilen seti o kadar çok azaltır ki, geri kalanını bir dizin olmadan aramak önemli değildir ve optimizer bu değeri seçmekte iyidir.
TToni

17

Kaçırılmış gibi görünen bir öğe yıldız dönüşümleridir. Dizin Kavşak operatörleri, bilgi tablosunda herhangi bir G / Ç yapılmadan önce her bir yüklemin vurduğu satır kümesini hesaplayarak yüklemi çözer. Bir yıldız şemasında, her bir boyut anahtarını dizine eklersiniz ve sorgu iyileştirici, dizin kesişim hesaplamasıyla hangi satırların seçileceğini çözebilir. Tek tek sütunlardaki dizinler bunun için en iyi esnekliği sağlar.


Soruyla ilgili (sıradan) indekslerin nasıl kullanıldığına ilişkin bağlantılı iyi açıklama için +1.
RobM

8

Sıklıkla nispeten statik bir sütun kümesi kullanacak sorgularınız varsa, tümünü içeren tek bir kaplama dizini oluşturmak performansı önemli ölçüde artıracaktır.

Dizininize birden çok sütun ekleyerek, optimize edicinin tabloya yalnızca dizinde bir sütun yoksa doğrudan erişmesi gerekir. Bunları veri ambarlarında çok kullanıyorum. Dezavantajı, bunu yapmak, özellikle de veriler çok değişkense, çok fazla masrafa neden olabilir.

Tek sütunlarda dizin oluşturma, OLTP sistemlerinde sıklıkla bulunan arama işlemleri için kullanışlıdır.

Sütunları neden dizine eklediğinizi ve nasıl kullanılacağını kendinize sormalısınız. Bazı sorgu planlarını çalıştırın ve bunlara ne zaman erişildiğini görün. Endeks ayarlama bilim kadar içgüdüseldir.

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.