Kısa versiyon: arama daha iyidir
Daha az kısa versiyon: arama genellikle daha iyidir, ancak çok fazla sayıda arama yapılır (örneğin kötü bir şekilde ilişkilendirilmiş alt sorgularla kötü sorgu tasarımından kaynaklanır veya bir imleç işleminde veya başka bir döngüde çok fazla sorgu yaptığınız için); özellikle sorgunuz etkilenen tablodaki satırların çoğundan veri döndürmeyi başlatabilirse, tarayın.
Performansın etkilerini tam olarak anlamak için veri bulma işlemlerinde tüm ailenin korunmasına yardımcı olur.
Tablo Taramaları: Sorgunuzla ilgili hiç bir indeks bulunmadığında, planlayıcı her satırın bakıldığı anlamına gelen bir tablo taraması kullanmak zorunda kalır. Bu, tablonun verileriyle ilgili her sayfanın genellikle en kötü durum olan diskten okunmasına neden olabilir. Bazı sorgular için yararlı bir dizin mevcut olsa bile bir tablo taraması kullanacağını unutmayın - bunun nedeni genellikle tablodaki verilerin çok küçük olmasıdır; Dizinin seçicilik ölçüsünün iyi olduğu varsayılarak, veriler büyüdükçe değişmeyi planlayın).
Satır Aramaları İçinde Dizin Taramaları: Bir arama için doğrudan kullanılabilecek hiçbir indeks bulunmaz, ancak doğru sütunları içeren bir indeks bulunur, bir indeks taraması kullanılabilir. Örneğin, column1, col2, col3 üzerinde bir dizine sahip 20 sütunlu büyük bir tablonuz varsa ve bu sayıyı yayınlarsanız, SELECT col4 FROM exampletable WHERE col2=616
bu durumda dizini sorgulamaya col2
taramak tüm tablonun taranmasından daha iyidir. Eşleşen satırlar bulunduğunda, veri sayfalarının çıktı (veya daha fazla birleştirme) için col4'ü almak için okunması gerekir; bu, sorgu planlarında gördüğünüzde "yer imi araması" aşamasıdır.
Dizin Aramaları Olmadan Dizin Taramaları: Yukarıdaki örnek SELECT col1, col2, col3 FROM exampletable WHERE col2=616
öyleyse, veri sayfalarını okumak için ek bir çabaya gerek kalmaz: bir kez dizin satırları eşleşmesi col2=616
bulunduğunda istenen tüm veriler bilinir. Bu yüzden bazen asla aranmayacak sütunlar görüyorsunuz, ancak endekslerin sonuna eklenmesi için çıktı isteniyor - satır aramalarını kaydedebiliyor. Dizine bu nedenle yalnızca bu nedenle sütunları eklerken INCLUDE
, motora bu sütunları temel alarak sorgulamak için dizin düzenini optimize etmesinin gerekmediğini söylemek için yan tümce ekleyin (bu, bu sütunlara yapılan güncellemeleri hızlandırabilir). . Dizin taramaları, süzgeç cümlecikleri olmayan sorgulardan da kaynaklanabilir: SELECT col2 FROM exampletable
bu örnek dizini tablo sayfaları yerine tarar.
Dizin Aradı (satır aramaları olsun veya olmasın) : Bir arayışta endeksin tamamı dikkate alınmaz. Sorgu için SELECT * FROM exampletable WHERE c1 BETWEEN 1234 AND 4567
sorgu motoru üzerinde endeksinde bir ağaç bazlı arama yaparak maç olacak ilk satırı bulabilirsiniz c1
bunun bir sorgu ile aynıdır (aralığının sonuna kadar gelene kadar o zaman sırayla endeksi gezinebilirsiniz çünkü c1=1234
bir =
operasyon için bile şartla eşleşen birçok satır olabilir ). Bu, indeks (veya tablodaki) her sayfa yerine yalnızca ilgili dizin sayfalarının (artı ilk arama için gerekli birkaç sayfa) okunması gerektiği anlamına gelir.
Kümelenmiş Dizinler: Kümelenmiş bir dizin ile tablo verileri, ayrı bir yığın yapısında olmak yerine o dizinin yaprak düğümlerinde depolanır. Bu [sizin gibi off-sayfa verilerini yoksa ne ihtiyaç vardır sütunlar olursa olsun o dizini kullanarak satırları bulduktan sonra herhangi bir ekstra satır aramalarını sağlanması gerekir asla anlamına gelir TEXT
sütun veya VARCHAR(MAX)
uzun veri içeren sütunlar].
Sadece bu nedenden dolayı bir kümelenmiş bir dizin olabilir [1] , kümelenmiş dizin olan yerine ayrı yığın yapısına sahip senin masa, kullandığınız takdirde bir [2] maksimum kazanç elde etmek için dikkatlice nereye koyduğunuzu seçti.
Ayrıca, kümelenmiş dizinin, tablonun "kümelenme anahtarı" olduğundan ve tablodaki kümelenmemiş her dizinde bulunduğundan, bu nedenle geniş kümelenmiş bir dizinin genellikle iyi bir fikir olmadığını unutmayın.
[1] Aslında, masadaki her sütunu kaplayan ya da içeren kümelenmemiş dizinleri tanımlayarak etkili bir şekilde kümelenmiş indekslere sahip olabilirsiniz , ancak bunun boşa harcanması muhtemeldir; gerçekten ihtiyacın var.
Dediğimde "Bir kümelenmiş bir dizin kullanırsanız" [2], genellikle önerilir unutmayın do do Her masada bir tane var. Tüm kurallara uymayan kurallar, toplu kesici uçlar dışında çok az şey gören tablolar ve sıralanmamış okumaların (belki de ETL işlemleri için hazırlama tabloları) en yaygın sayaç örneği olduğu gibi istisnalar vardır.
Ek nokta: Eksik Taramalar:
Sorgunun geri kalan kısmına bağlı olarak, bir tablo / dizin taramasının aslında tüm tabloyu taramayabileceğini hatırlatmak önemlidir - eğer mantık sorgu planının erken iptal edilmesine neden olabilirse. Bunun en basit örneği şudur SELECT TOP(1) * FROM HugeTable
: Bunun için sorgu planına bakarsanız, taramadan yalnızca bir satırın döndüğünü SET STATISTICS IO ON; SELECT TOP(1) * FROM HugeTable
göreceksiniz ve GÇ istatistiklerini ( ) izlerseniz ( ) sadece çok küçük bir sayı okuduğunu görürsünüz Sayfaların (belki sadece bir).
Aynı şey, a WHERE
veya JOIN ... ON
yan tümcesinin belirtisi, eğer verileri ise kaynak olan taramayla aynı anda çalıştırılabilirse gerçekleşebilir. Sorgu planlayıcısı / koşucu bazen bu şekilde tarama erken sonlandırılmasını sağlamak için veri kaynakları doğru geri yüklemler iterek hakkında çok zeki olabilir ki (ve bazen sen bunu yapmak yardım etmek sorguları yeniden düzenleme içinde zeki olabilir ki!). İken veri sağdan sola standart sorgu planı ekranda oklar göre akar, mantık soldan sağa çalışır ve bir sonraki başlamadan önce her adım (sağdan sola) ille tamamlanma çalıştırılan değil. Yukarıdaki basit örnekte, sorgu planındaki her bir bloğa bir aracı olarak bakarsanız, SELECT
aracıdan TOP
bir satır sorar;TABLE SCAN
biri için SELECT
ajan , o zaman ajan diğerini sorar, ancak TOP
ajan masa okuyucuyu sormaya bile zahmet etmenin gerekmediğini bilir, SELECT
ajan "artık ilgili değildir" cevabını alır ve tüm işlerin yapıldığını bilir. Birçok işlemleri bir tablo / dizin tarama gerçekten daha karmaşık örneklerde sık sık elbette optimizasyonu bu tür bloke etmez her satır okumak, ancak herhangi bir tarama pahalı bir işlem olmalıdır sonucuna atlamak için dikkatli olun.