Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 11383|Yanıt: 0

[İletişim] SQL Server Bileşik İndeks Öğrenimi

[Bağlantıyı kopyala]
Yayınlandı 29.01.2015 13:06:03 | | |

Genel Bakış
Tek bir endeks nedir ve bileşik endeks nedir? Yeni bir bileşik endeks ne zaman oluşturulmalı ve bileşik endekste nelere dikkat etmeliyim? Bu makale esas olarak internetteki bazı tartışmaların özetidir.

Bir. Kavram

Tek bir indeks, indeksin tek bir sütunda listelendiği bir durumdur; yani yeni bir indeks oluşturma ifadesi yalnızca bir sütunda uygulanır.

Kullanıcılar, bileşik indeksler (birleşik indeksler) olarak adlandırılan birden fazla sütunda indeksler oluşturabilirler. Bileşik indeksler, tek endekslerle tamamen aynı şekilde oluşturulur. Ancak bileşik indeksler, veritabanı işlemleri sırasında daha az yük gerektirir ve birden fazla tek indeksin yerini alabilir. Bir tablodaki satır sayısı anahtar sayısından çok daha fazla olduğunda, bu yöntem tablonun sorgulama hızını önemli ölçüde hızlandırabilir.

Aynı anda iki kavram vardır: dar indeksler ve geniş indeksler; dar indeksler 1-2 sütunlu indeksleri ifade eder ve genellikle aksi belirtilmedikçe tek bir indekse atıfta bulunur. Geniş indeks, 2'den fazla sütuna sahip bir indekstir.

Endeks tasarımının önemli bir ilkesi, geniş indeksler yerine dar indekslerin kullanılmasıdır; çünkü dar indeksler, birleşik indekslerden daha etkili olma eğilimindedir. Daha dar indekslere sahip olmak, optimizatora daha fazla seçenek sunar ve bu da genellikle performansı artırmaya yardımcı olur.

İki. Kullanım

Bir indeks oluşturun
Table1'de IDX1 indeksini oluştur (col1,col2,col3)  
Sorgulamak
tablo 1'den * seç, burada col1= A ve col2= B ve col3 = C

Şu anda, sorgu optimizatörü tabloyu taramaz, doğrudan indeksten veri alır; çünkü indekste bu veri vardır ve buna örtü sorgusu denir ve sorgu hızı çok hızlıdır.   

Üç. Notlar:

1. Bileşik indeks ne zaman kullanılır
Burada koşulunda alan indekslenir ve birden fazla alan kullanılırsa bileşik bir indeks kullanılır. Genellikle, seçim alanında herhangi bir endeks oluşturma (mytable'dan col1, col2, col3 seçmek istiyorsanız, yukarıdaki indekse ihtiyacınız yok). Koşullara göre indeksleme son derece önemli bir ilkedir. Çok fazla endeks kullanmamaya dikkat edin, aksi takdirde tablo güncellemelerinin verimliliği üzerinde büyük bir etkisi olur, çünkü tabloları çalıştırırken endeks oluşturmak için çok zaman harcamanız gerekir.

2. Bileşik indeksler için, sorgu kullanılırken, en verimli olan endeksleri bulma sırasını takip etmek en iyisidir. Örneğin:  
  IDX1:Table1'de indeks idx1 yarat (col2,col3,col5)  
  * seçin, tablo 1'den col2=A ve col3=B ile col5=D  

Eğer "tablo 1'den * seç, burada col3=B ve col2=A ve col5=D" ise.
Ya da "col3=B" indeksini kullanmayacağı tablo 1'den * seç, ya da etki fark edilmez

3. Bileşik endeks tek bir endeksi değiştirecek mi?
Birçok kişi, kümelenmiş indekse herhangi bir alan eklemenin sorgu hızını artırabileceğini düşünüyor, ancak bazıları kafası karışık: Bileşik kümelenmiş indeks alanları ayrı ayrı sorgulanırsa, sorgu hızı yavaşlar mı? Bu soruyla birlikte, aşağıdaki sorgu hızına bakalım (sonuç seti 250.000 veri) :( tarih sütunu fariqi bileşik toplama indeksinin başlangıç sütununda birinci sırada, kullanıcı adı neibuyonghu ise ikinci sırada yer alıyor)

IDX1:create   index   idx1   on   Tgongwen(fariqi,neibuyonghu)  

(1) Tgongwen'den Gid, Fariqi, Neibuyonghu unvanlarını seçer
Fariqi>'2004-5-5'

Sorgulama hızı: 2513 ms

(2) Tgongwen'den Gid, Fariqi, Neibuyonghu unvanlarını seçer
Fariqi>'2004-5-5' ve neibuyonghu='ofis' nerede

Sorgulama hızı: 2516 ms

(3) Tgongwen'den Gid, Fariqi, Neibuyonghu unvanlarını seç
nerede neibuyonghu='ofis'

Sorgu hızı: 60280 milisaniye

Yukarıdaki deneylerden, sorgu koşulu olarak yalnızca kümelenmiş indeksin başlangıç sütunu kullanılırsa, bileşik kümelenmiş indekse sahip tüm sütunların sorgu hızının neredeyse aynı, hatta sorgu sonuç kümelerinin sayısı aynı olduğunda tüm bileşik indeks sütunlarının kullanılmasından biraz daha yüksek olduğunu görebiliyoruz. Eğer sadece bileşik toplu indeksin başlangıç olmayan sütunları sorgu koşulları olarak kullanılırsa, bu indeks hiçbir şey yapmaz. Elbette, 1 ve 2 ifadelerinin sorgu hızı aynıdır çünkü sorgudaki giriş sayısı aynıdır; bileşik indeksin tüm sütunları kullanılırsa ve sorgu sonuçları azsa, bu bir "indeks geçersiz kılma" oluşturur ve performans optimize edilebilir. Ayrıca, toplu indekste diğer sütunları sık kullansanız da kullanmasanız da, en sık kullanılan sütun önde olan olmalıdır.

[Referans: Sorgu Optimizasyonu ve Sayfa Oluşturma Algoritması Şeması http://blog.csdn.net/chiefsailor/archive/2007/05/28/1628339.aspx]

4. Aynı sütunda aynı anda tek bir indeks ve bileşik bir indeks oluşturmam mı gerekiyor?
Deney: Sysbase 5.0 tablo 1 alanları: col1, col2, col3  

Test Adımları:  
(1) col1 üzerinde idx1 indeksini oluşturun  
  Tablo1'den * seçmesini çalıştırın burada col1=A idx1 kullanır  
  Tablo1'den * seçmeyi çalıştırın, burada col1=A ve col2=B ayrıca idx1 kullanır  

(2) idx1 indeksini silin ve ardından (col1,col2) bileşik indeks üzerinde idx2 oluşturun  
  Her iki sorgu da idx2 kullanır  

(3) Eğer idx1 ve idx2 her iki indeks de varsa  
  col1='A' idx1 kullanmıyor; col1=A ve col2=B idx2 kullanıyor.  
  Sorgu optimizatoru, daha önce yaygın olarak kullanılan indekslerden birini kullanır. Ya idx1 ya da idx2 kullanın.  
   
Görülebiliyor ki
(1) Bir tablo için, (col1, col2) üzerinde bileşik bir indeks varsa, col1 üzerinde aynı anda tek bir endeks oluşturulmasına gerek yoktur.
(2) Sorgu koşulları gerektiriyorsa, col1 üzerinde zaten tek bir endeks varken (col1, col2) üzerindeki bileşik endeksi ekleyebilirsiniz; bu da verimliliği belli bir ölçüde artırabilir.
(3) Aynı anda birden fazla alanla (5 veya 6 alan içeren) bileşik bir indeks oluşturmanın pek fazla faydası yoktur; göreceli olarak, birden fazla dar alandan oluşan (sadece bir veya en fazla 2 alan içeren) bir indeks oluşturmak daha iyi verimlilik ve esneklik sağlayabilir.



5. Soruyu karşılamam gerekiyor mu?
Genellikle, tam sorgu kapsamını vurgulayan bir strateji kullanmamak en iyisidir. Eğer Select maddesindeki tüm sütunlar kümelenmemiş bir indeks tarafından üzerine yazılırsa, optimizator bunu fark eder ve iyi performans sağlar. Ancak bu genellikle aşırı geniş bir endeks ve optimizatorun poliçeyi kullanma olasılığına aşırı bağımlılık anlamına gelir. Genellikle, dar indeksler daha fazla sayıda sorgu için kullanılır ve bu da büyük sorgular için daha iyi performans sağlar.




Önceki:C# winform sql enjeksiyonunu engeller
Önümüzdeki:Dell Server Hata Kodları ve Çözümleri 2013 Sürümü
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com