SQL Server Planları: Dizin Tarama / Dizin Arama arasındaki fark


89

SQL Server Yürütme planında, Dizin Taraması ile Dizin Araması arasındaki fark nedir

SQL Server 2005 kullanıyorum.

Yanıtlar:


129

Bir dizin taraması, SQL sunucusunun eşleşmeleri arayan dizinin tamamını okuduğu yerdir - bunun için gereken süre dizinin boyutuyla orantılıdır.

Bir dizin arama, SQL sunucusunun doğrudan eşleşen kayıtları aramak için dizinin b-ağaç yapısını kullandığı yerdir (bunun nasıl çalıştığına dair bir fikir için bkz. Http://mattfleming.com/node/192 ) - alınan süre yalnızca orantılıdır eşleşen kayıtların sayısı.

  • Genel olarak, bir dizin taramasına (eşleşen kayıtların sayısı orantılı olarak toplam kayıt sayısından çok daha düşük olduğunda) tercih edilir, çünkü bir dizin araması yapmak için geçen süre, içindeki toplam kayıt sayısına bakılmaksızın sabittir. tablo.
  • Bununla birlikte, belirli durumlarda bir dizin taramasının bir dizin aramasından daha hızlı olabileceğini (bazen önemli ölçüde daha hızlı) - genellikle tablo çok küçük olduğunda veya kayıtların büyük bir yüzdesi yüklemle eşleştiğinde - unutmayın.

3
Bağlantı hala aktif mi? benim için çalışmıyor. Güncellenmiş bir bağlantı varsa lütfen yardım edin
Ronak Agrawal

2
@RonakAgrawal Bağlantı aslında ölü gibi görünüyor - bunun yerine Wikipedia'ya bakabilirsiniz ?
Justin


77

İzlenecek temel kural Taramalar kötüdür, Arayışlar iyidir.

Dizin Taraması

SQL Server bir tarama yaptığında, okumak istediği nesneyi diskten belleğe yükler, ardından bu nesneyi yukarıdan aşağıya doğru okuyarak ihtiyaç duyduğu kayıtları arar.

Dizin Arama

SQL Server bir arama yaptığında, verinin dizinde nerede olacağını bilir, böylece dizini diskten yükler, doğrudan ihtiyaç duyduğu dizine gider ve ihtiyaç duyduğu verinin nerede bittiğini okur. . Bu açıkça bir taramadan çok daha verimli bir işlemdir, çünkü SQL aradığı verilerin nerede olduğunu zaten biliyor.


Tarama yerine Arama kullanmak için bir Yürütme Planını nasıl değiştirebilirim?

SQL Server verilerinizi ararken, muhtemelen SQL Server'ın aramadan taramaya geçmesini sağlayacak en büyük şeylerden biri, aradığınız sütunlardan bazılarının kullanmak istediğiniz dizine dahil edilmediği zamandır. Kümelenmiş dizin tablodaki tüm sütunları içerdiğinden, çoğu zaman bu, SQL Server'ın kümelenmiş dizin taraması yapmaya geri dönmesine neden olur. Bu, sütunları dizinin dizinlenmiş sütunlarına eklemeden bir dizindeki sütunları DAHİL ETME yeteneğine sahip olmamızın (en azından bence) en büyük nedenlerinden biridir. Dizine ek sütunlar ekleyerek dizinin boyutunu arttırırız, ancak SQL Server'ın bu değerleri almak için kümelenmiş dizine veya tabloya geri dönmek zorunda kalmadan dizini okumasına izin veririz.

Referanslar

Bir SQL Server Yürütme planı dahilinde bu operatörlerin her birinin özelliklerine ilişkin bilgi için bkz. ....


7

Kısa cevap:

  • Dizin taraması: Belirli sütunlar dışında tüm satırlara dokunun.

  • Dizin arama: Belirli satırlara ve belirli sütunlara dokunun.


4

Bir Dizin Taraması ile, dizindeki tüm satırlar, eşleşen bir satır bulmak için taranır. Bu, küçük masalar için verimli olabilir. Bir Dizin Arama ile, yalnızca kriterleri gerçekten karşılayan satırlara dokunması gerekir ve bu nedenle genellikle daha performanslı olur


2

Bir Dizin Taraması, dizin tanımı arama tahminlerini karşılamak için tek bir satırda bulunamadığında gerçekleşir. Bu durumda SQL Server, arama tahminlerini karşılayan bir dizi satır bulmak için birden çok sayfayı taramalıdır .

Dizin Arama durumunda, SQL Server, dizin tanımını kullanarak arama tahminleriyle eşleşen tek bir satır bulur .

Index Seeks daha iyi ve daha etkilidir.


0

Tarama, peşinde olsanız da olmasanız da tablodaki her satıra dokunur

Bir arama, yalnızca aradığınız satırlara bakar.

Taramalar, verilere bakma biçiminde daha verimli oldukları için taramalardan her zaman daha iyidir.

İyi bir açıklama bulunabilir burada


3
Aramalar her zaman daha iyi değildir , örneğin tablo nispeten küçükse ve bu tablodaki satırların büyük bir yüzdesinin döndürülmesi gerekiyorsa, bir dizin taraması çok daha verimli olabilir.
Justin

1
Merhaba Justin, sanırım masa taramalarının bazı zamanlar daha iyi olabileceğini söylemek istiyorsun. Dizinler Aramak, kümelenmeden bahsetmedikçe, bir Dizin Taramasından her zaman daha iyidir. Ancak, bazen bir tablo taraması veya Kümelenmiş Dizin Taraması, bahsettiğiniz nedenle daha verimli olabilir. İndeksi aramak ve alanların tablodan indekste olmaması yerine bazen ms sql, indeks kriter alanına sahip olsa bile tabloyu kullanacaktır.
Jose Bölgeleri
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.