Aşağıdaki sorgu var:
select databasename
from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source)
Yukarıdaki sorgu üç saniye içinde tamamlanır.
Yukarıdaki sorgu herhangi bir değer döndürürse, saklı yordamın EXIT olmasını istiyoruz, bu yüzden aşağıdaki gibi yeniden yazdım:
If Exists(
select databasename
from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source)
)
Begin
Raiserror('Source missing',16,1)
Return
End
Ancak bu 10 dakika sürüyor.
Yukarıdaki sorgu da 3 saniyeden daha kısa sürede tamamlanır aşağıdaki gibi yeniden yazabilirsiniz:
select databasename
from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source
if @@rowcount >0
Begin
Raiserror('Source missing',16,1)
Return
End
Yukarıdaki yeniden yazmayla ilgili sorun, yukarıdaki sorgunun daha büyük saklı yordamın bir parçası olması ve birden çok sonuç kümesi döndürmesidir. C # 'da, her sonuç kümesi boyunca yineleme yaparız ve bazı işlemler yaparız.
Yukarıdaki boş bir sonuç kümesi döndürür, bu yüzden bu yaklaşım ile gitmek, C # değiştirmek ve yeniden dağıtım yapmak zorunda.
Benim sorum şu,
Neden kullanmak
IF EXISTS
bu kadar zaman alacak planı değiştiriyor?
Aşağıda size yardımcı olabilecek ayrıntılar ve herhangi bir ayrıntıya ihtiyacınız varsa bana bildirin:
- Benimkiyle aynı planı almak için tablo ve istatistik komut dosyası oluştur
- Yavaş İcra Planı
Hızlı Uygulama Planı
Brentozar kullanarak yavaş plan planı Yapıştır Brentozar kullanarak
hızlı plan planı Yapıştır
Not: Her iki sorgu da aynıdır (parametreleri kullanarak), tek fark EXISTS
(anonimleştirirken bazı hatalar yapmış olabilirim).
Tablo oluşturma komut dosyaları aşağıdadır:
http://pastebin.com/CgSHeqXc - küçük masa istatistikleri
http://pastebin.com/GUu9KfpS - büyük masa istatistikleri