Neden bir toplu sorgunun bir GROUP BY
cümle ile neden birden çok daha hızlı çalıştığını merak ediyorum .
Örneğin, bu sorgunun çalışması yaklaşık 10 saniye sürer
SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1
Bu bir saniyeden az sürerken
SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1
GROUP BY CreatedDate
CreatedDate
Bu durumda yalnızca bir tane vardır, bu nedenle gruplandırılmış sorgu, grubu çözülmüş olanla aynı sonuçları döndürür.
İki sorgu için yürütme planları farklı olduğunu fark ettim - İkinci sorgu ilk sorgu değil iken Parallelism kullanır.
SQL Server için bir GROUP BY yan tümcesi yoksa bir toplu sorgu farklı değerlendirmek normal mi? Ve bir GROUP BY
cümle kullanmadan 1. sorgunun performansını artırmak için yapabileceğim bir şey var mı?
Düzenle
Ben sadece OPTION(querytraceon 8649)
bu sorgu ipucu kullanmak için herhangi bir dezavantajı olup olmadığını bilmiyorum rağmen, sorgu bazı paralellik kullanmak yapar ve çalışma süresini 2 saniye azaltır yapar, 0 paralellik maliyet yükü ayarlamak için kullanabilirsiniz öğrendim .
SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1
OPTION(querytraceon 8649)
Sorgu kullanıcı seçimi üzerine bir değer doldurmak için amaçlandığı için hala daha kısa bir çalışma zamanı tercih ediyorum, bu yüzden ideal bir şekilde gruplandırılmış sorgu gibi anlık olmalıdır. Şu anda sadece sorgumu sarım ama bunun gerçekten ideal bir çözüm olmadığını biliyorum.
SELECT Min(CreatedDate)
FROM
(
SELECT Min(CreatedDate) as CreatedDate
FROM MyTable WITH (NOLOCK)
WHERE SomeIndexedValue = 1
GROUP BY CreatedDate
) as T
Düzenle # 2
Martin'in daha fazla bilgi talebine yanıt olarak :
Hem CreatedDate
ve SomeIndexedValue
onlara ayrı bir benzersiz olmayan, sigara kümelenmiş bir dizin var. SomeIndexedValue
aslında başka bir tablonun PK (int) değerini gösteren sayısal bir değer saklasa da bir varchar (7) alanıdır. İki tablo arasındaki ilişki veritabanında tanımlanmamıştır. Ben hiç veritabanını değiştirmek gerekiyordu ve sadece veri sorgulayan sorgular yazabilirsiniz.
MyTable
3 milyondan fazla kayıt içerir ve her kayda ait olduğu bir grup atanır ( SomeIndexedValue
). Gruplar 1 ile 200.000 arasında kayıt olabilir
MAXDOP
sorgunun kullanabileceği işlemci sayısını sınırlayan maksimum paralellik derecesini ayarlar. Bu temelde 2. sorguyu birincisi kadar yavaş çalıştıracaktır, çünkü parazit kullanma yeteneklerini kaldırıyor, ki bu benim istediğim şey değil.