Uygulama Planı Temelleri - Karma Eşleme Karışıklık


39

İcra planlarını öğrenmeye başlıyorum ve bir karma eşlemenin tam olarak nasıl çalıştığını ve neden basit bir katılımla kullanılacağı konusunda kafam karıştı:

select Posts.Title, Users.DisplayName
From Posts JOIN Users on
Posts.OwnerUserId = Users.Id
OPTION (MAXDOP 1)

görüntü tanımını buraya girin

Anladığım kadarıyla Top index taramasının sonuçları hash hale gelir ve alt Index kümelenmiş taramasındaki her satır aranır. Karma tabloların en azından bir dereceye kadar nasıl çalıştığını anlıyorum, ancak bunun gibi bir örnekte hangi değerlerin tam olarak kazanıldığı konusunda kafam karıştı.

Beni mantıklı kılan, aralarındaki ortak alan, kimliği, karma olduğu - ama eğer böyleyse, neden bir sayı?

Yanıtlar:


29

SQLRockstar'ın cevaplarından alıntılar

büyük, sıralanmamış girişler için en iyisi.

Şimdi,

  • Kullanıcılar.
  • Ayrıca OwnerUserId için Gönderileri tarıyorsunuz = sıralanmamış

Bu 2 sırasız girdi.

Başlık da dahil olmak üzere OwnerUserId'deki Mesajlar tablosunda bir dizin düşünebilirim. Bu, girişin bir tarafına JOIN + 'a bir endeks ekleyecektir.

CREATE INDEX IX_OwnerUserId ON Posts (OwnerUserId) INCLUDE (Title)

Daha sonra Users.DisplayName dizininin kullanılmayacağını ve bunun yerine PK'yi taradığını görebilirsiniz.


1
Ah tamam, şimdi anlıyorum, Kullanıcılar'ı düşünüyordum. GösteriAdı, sadece durum böyle olmayan PK tarafından sipariş edildi. Şimdi Hash kullanımı bana çok daha mantıklı geliyor. Teşekkürler!
Kyle Brandt

1
Ayrıca OPTION (FAST n), n'in beklediğiniz kaba satır sayısı olduğu ipucunu da deneyebilirsiniz . Bunun yapacağı şey, optimize ediciyi, n düşük olduğunda karma birleşimler yerine iç içe halkalara doğru yönlendirmek. Bunun nedeni, karma birleşimlerin büyük birleşimler için hızlı olmaları ancak yüksek başlangıç ​​maliyetlerine sahip olmalarıdır. İç içe döngüler satır başına pahalıdır, ancak çok ucuza başlayabilirler. Bu nedenle, gerçek verilerinize ve erişim düzeninize bağlı olarak ince ayar yapılması önemlidir.
Gaius

1
@Gaius: Şahsen ipuçlarından çok indeksleri tercih ederim. Bir ipucu, yalnızca eklediğinizde sorgu için iyidir. Aka ipucu zamanla bir sorumluluk haline gelir. Endeksler çok daha faydalı olma eğilimindedir.
gbn

1
ya bir ya da teklif değildir :-)
Gaius

14

Gönderen http://sqlinthewild.co.za/index.php/2007/12/30/execution-plan-operations-joins/

"Karma birleştirme, birleştirmek için bir karma tablo oluşturulmasını gerektirdiğinden, daha pahalı birleştirme işlemlerinden biridir. Bu, büyük, sıralanmamış girdiler için en iyisi birleşimdir. birleşimlerden

Karma birleştirme ilk önce girdilerden birini okur ve birleştirme sütununu karma tutar ve elde edilen karma ve sütun değerlerini bellekte yerleşik bir karma tabloya yerleştirir. Sonra ikinci girişteki tüm satırları okur, bunları birleştirir ve sonuçtaki karma kovadaki satırları birleştirme satırları için kontrol eder. "

Bu yazıya hangi bağlantılar:

http://blogs.msdn.com/b/craigfr/archive/2006/08/10/687630.aspx

HTH


Öyleyse, sadece kimlik alanları ise, sanırım bir kimlik alanına sahip olmanın avantajını anlamıyorum?
Kyle Brandt

Freedman'ın bloguna link için +1, daha fazla katılım makalesi var: blogs.msdn.com/b/craigfr/archive/tags/joins
Jeff

9

Sayısal bir alana sahip olmanın avantajı, daha büyük bir değer almanız ve bir karma tabloya sığması için daha küçük parçalara ayırmanızdır.

Grant Fritchey şöyle açıklıyor:

"Öte yandan, karma tablo, öğelere hızlı erişime izin vermek için tüm öğeleri eşit boyutlu kategorilere veya kovalara bölen bir veri yapısıdır. Karma işlevi, bir öğenin hangi kepçeye gireceğini belirler. Örneğin "Bir tablodan bir satır alabilir, bir karma değere göre harcayabilir, ardından karma değerini bir karma tabloya kaydedebilirsiniz."

Ayrıca aşağıdaki makaleden bir bağlantıdan "SQL Server Yürütme Planlarını Dissecting" kitabının ücretsiz bir kopyasını da alabilirsiniz:

Kaynak: http://www.simple-talk.com/sql/performance/graphical-execution-plans-for-simple-sql-queries/



Ben SQL Server Yürütme Planları Disissection olsa yolumda çalışıyorum - bu harika! Ama bu noktada biraz takılıp kaldım :-P
Kyle Brandt

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.