TSQL Top neden bir değişkenle daha hızlı?


10

Herkese günaydın,

Kendi şirket uygulamalarımızda görüntülemek için bir üçüncü taraf ürün veritabanından bazı verileri 'elde etmek' için orta derecede karmaşık bir sql üzerinde çalışıyorum.

Bir alt sorgudaki bir tablodan en iyi kaydı elde etmek için bir seçim ekledim (eğer bu mantıklıysa)

sorguyu kullanarak 100 kayıtlık bir son sonuç kümesi döndürmek yaklaşık 3 dakika sürdü

SELECT TOP 1 ...

Ulaşmaya çalıştığım şeyde iyileştirmeler için çevrimiçi bir görünüme sahiptim ve aşağıdaki gibi bir değişken kullanmak için seçimimi değiştirmem önerildi

DECLARE @topCount INT
SET @topCount = 1

SELECT TOP (@topCount) ...

Bu aynı sorgu 3minutes aşağı 1 saniye, hangi büyük aldı!

Ama herkes bunun neden böyle olduğunu açıklayabilir.

Yanıtlar:


14

Bunu yaptığınızda top 1sorgu optimizer mümkün olduğunca hızlı bir şekilde 1 satır getirmek için inşa edilmiş bir plan inşa edecektir.

Yerel bir değişken kullandığınızda, değişkenin değeri optimize edici tarafından bilinmez ve bunun yerine mümkün olduğunca hızlı bir şekilde 100 satır getirecek şekilde optimize edilmiş bir plan oluşturur.

Sizin durumunuzda 100 satırlık bir hedefle oluşturulan sorgu planı, yalnızca bir satır isteseniz bile daha iyi bir plandır.

Doğrulamak option (recompile)için değişkenle sorgunuza eklemeyi deneyebilirsiniz . Bu durumda, SQL Server geçerli değerini @topCountbir satır hedefi olarak kullanır ve bu 1 olduğundan yavaş planı almanız gerekir.


Plandaki farkı anlıyorum, ancak 1 satır getirmenin 100 satır getirmekten daha yavaş olabileceği beni şaşırtıyor. 100 satırlı plan en iyi çalışır, SQL Server için aynı planı kullanır düşünürdüm top 1.
Brandon

@Brandon 100 satır getirmez, sadece 100 satır istendiği varsayımıyla yürütme planını oluşturur. 1 satır bulunduğunda yürütme sona erer.
Mikael Eriksson

Bu durumlarda yürütme planı ile neyin farklı olduğunu kontrol etmek muhtemelen sorunun ilk 1'de ne olduğunu anlamaya yardımcı olacaktır.
James Z
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.