2011-01-20 23 views
6

Aşağıdaki sorgular için SQL Server yürütme planını anlamama yardımcı olan herhangi biri var mı?SQL Server scalar işlevi ile alt sorgu yürütme planı analizi

Alt sorgu sürümünün (Query 2) daha hızlı çalışmasını bekledim, çünkü ayar tabanlı. marjinal - - Bu bağımsız sorgular runnning zaman davayı gibi görünen yürütme planı% 85 sırasıyla% 15 vs olarak sorgu maliyetleri gösterir ancak: Burada ne eksik

//-- Query 1 (15%) - Scalar Function 
SELECT 
    gi.GalleryImageId, 
    gi.FbUserId, 
    dbo.GetGalleryImageVotesByGalleryImageId(gi.GalleryImageId) AS Votes 
FROM 
    GalleryImage gi 

//-- Query 2 (85%) - Subquery 
SELECT 
    gi.GalleryImageId, 
    gi.FbUserId, 
    (SELECT COUNT(*) FROM GalleryImageVote WHERE GalleryImageId = gi.GalleryImageId) 
FROM 
    GalleryImage gi 

; yürütme planı, işlevin maliyetini atlıyor mu? Ayrıca, yukarıdakilerden herhangi birinin bir CTE veya AVER/PARTITION sorgusuyla daha iyi sunulup sunulmayacağı konusunda herhangi bir öneriniz var mı?

Teşekkürler!

+0

İkisini de aynı sorgu düzenleyicisi penceresinde aldınız mı? Sorgu analizcisi bunları karşılaştıracak ve her bir göreceli değeri pencerede olana (% 15 /% 85) atayacaktır. – JNK

+0

Evet,% değerlerin geldiği yer burası :) – Robarondaz

+0

Sorgu yürütme zamanı her zaman maliyete eşit değil. SQL Server, CPU ve RAM kullanımını HDD okumalarından daha yüksek bir ağırlık gibi görünüyor. – jahu

cevap

6

Yürütme Planına asla güvenme. Bu planın ne olacağını görelim için çok yararlıdır, ancak istatistiklerine

set statistics io on 
set statistics time on 

..ve gerçek infaz karşılaştırmak üzerine, hep dönüş gerçek ölçümlerini istiyorum. İstatistikler, beklentinin% 15 /% 85 olduğunu söyleyebilir, ancak gerçekler size gerçekten ne ifade ettiğini gösterir.

Performans ayarlaması için gümüş mermi yok. "En iyi" sorguları bile verilerinizin şekli veya şekli değiştikçe zaman içinde değişebilir.

CTE çok farklı olmayacak ve bunun üzerinde bir PARTITION sorgusu yapmayı nasıl planladığınızdan emin değilim, ancak left join formunu deneyebilirsiniz.

SELECT 
    gi.GalleryImageId, 
    gi.FbUserId, 
    count(v.GalleryImageId) AS Votes 
FROM 
    GalleryImage gi 
    LEFT JOIN GalleryImageVote v ON v.GalleryImageId = gi.GalleryImageId 
GROUP BY 
    gi.GalleryImageId, gi.FbUserId 
+0

Şerefe, istatistikleri bilmiyordum. Gerçek uygulama süresi, 265 ms (Query 1) vs 2ms (Query 2) idi; Aslında beklediğim ile çok daha uyumlu! – Robarondaz

4

Optimiser, fonksiyonun maliyetini bilmiyor.

Sen

CPU görmek ve okur ve Süre

ilgili bazı cevaplar olsa benzer sorulardan profilcisine aktarma yöntemiyle. OneTwo

  • Inline tablo fonksiyonları
  • Skaler (sizin bir) ve çoklu deyim tablo fonksiyonları yoktur ve "dış" sorguya siyah kutular (onlar görünümleri gibi makrolardır) ana sorguya genişletmek
+0

Yardımlarınız için teşekkürler! – Robarondaz