2009-09-08 12 views
7

LEFT JOIN'dan LEFT HASH JOIN veya 'LEFT LOOP JOIN' öğelerine değişiklik yaparak 6 saniyeden 1 saniyeye kadar giden temel bir sorgum var. Herkes bunun neden bu kadar büyük bir performans artışına neden olacağını açıklayabilir mi ve SQL'in optimizerının neden kendi başına çözülmediğini açıklayabilir mi?Neden 'HASH JOIN' veya 'LOOP JOIN' bu saklanan progeyi iyileştiriyor?

SELECT 
    a.[ID] 
FROM 
    [TableA] a 
LEFT HASH JOIN 
    [TableB] b 
    ON b.[ID] = a.[TableB_ID] 
JOIN 
    [TableC] c 
    ON c.[ID] = a.[TableC_ID] 
WHERE 
    a.[SomeDate] IS NULL AND 
    a.[SomeStatus] IN ('X', 'Y', 'Z') AND 
    c.[SomethingElse] = 'ABC' 

Tablo A ve B tüm kimlik alanları kayıtları ve endeksler milyonlarca vardır: İşte

gibi SQL benzediğini kabaca olduğunu. SQL Server kullanarak 2005.

Düzenleme: Bir collegue bir SOL LOOP JOIN önerdi ve bunun da hızlı ... SQL benim güçlü yönlerinden biri nasıl bu 'ipuçları' anlamaya çalışıyorum böyle olmadığını yapmış gibi görünüyor yardım ediyor. Satırların büyük yüzdesi sonuç kümesine katkıda bulunduğunda,

+0

Planın ipucu uygulanmadan önce ve sonra gönderilmesini rica edebilir misiniz? Sadece 'GO SHOWPLAN_TEXT SET SEÇ'… ' – Quassnoi

+0

Tüm ipuçlarını kaldırın ve ardından show fiili planıyla SSMS'de sorguyu çalıştırın, ardından planda Tahmini satır sayısını, tarama/arama işleçleri için gerçek satır sayısıyla karşılaştırın. plan. Plan, * tahmini * sayısına bağlı olarak üretilir, süre * gerçek * sayım tarafından sürülür. Tutarsızlıklar, kötü istatistikleri gösterir, ancak sıra dışı, tek değerler için iyi istatistiklerle de olabilir (örneğin, 1 Mil.lik satır 10 olan bir "SomeStatus"). –

cevap

6

HASH JOIN yararlıdır. Bir HASH TABLEA aç veya B ve başka tablo tarayarak B.ID üzerine endeksi üzerinde NESTED LOOPS performans veya iyileştirici ipucu önce kullanılan sıralı resultsets birleştirilmesi ya daha ucuzdur inşaatındaki durumda

.

SQL Server'un en iyileştiricisi bunu görmüyordu: büyük olasılıkla, veri dağıtımınız çarpılmış olduğundan istatistik toplayamadığınız için.

Güncelleme: Eğer LOOP JOIN hızı geliştirilmiş belirtti yana

, bu JOIN sipariş iyileştirici tarafından yanlış seçildi ve böylece olabilir.

+0

Bu durumda, hemen hemen tüm satırlar başarıyla katılmalıdır (örneğin,% 90 +). – Kelsey

+0

sabit s/dağıtım/dağıtım. Ayrıca: Son olarak sql-server istatistikleri sayfasında toplam oy için beni geçtiğiniz gibi görünüyor. Konu hakkında daha bilgili olduğunuzu özgürce kabul ediyorum ve bu yüzden dünya artık sadece biraz daha az kalorifere sahip. http://stackoverflow.com/questions/tagged?tagnames=sql-server&sort=stats&pagesize=30 –

+0

Teşekkürler, cevabınız bunun neden oluştuğunu anlamama yardımcı oldu. – Kelsey