Saya punya pertanyaan di bawah ini:
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)
Kueri di atas selesai dalam tiga detik.
Jika kueri di atas mengembalikan nilai apa pun, kami ingin prosedur tersimpan EXIT, jadi saya menulis ulang seperti di bawah ini:
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
Namun ini membutuhkan waktu 10 menit.
Saya dapat menulis ulang kueri di atas seperti di bawah ini, yang juga selesai dalam waktu kurang dari 3 detik:
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
Masalah dengan penulisan ulang di atas adalah bahwa kueri di atas adalah bagian dari prosedur tersimpan yang lebih besar dan mengembalikan beberapa set hasil. Dalam C #, kita mengulangi setiap set hasil dan melakukan beberapa pemrosesan.
Di atas mengembalikan set hasil kosong, jadi jika saya pergi dengan pendekatan ini, saya harus mengubah C # dan melakukan penyebaran lagi.
Jadi pertanyaan saya adalah,
mengapa menggunakan hanya
IF EXISTS
mengubah rencana untuk mengambil begitu banyak waktu?
Di bawah ini adalah detail yang dapat membantu Anda dan beri tahu saya jika Anda membutuhkan detail:
- Buat skrip tabel dan statistik untuk mendapatkan paket yang sama dengan skrip saya
- Rencana Eksekusi Lambat
Rencana Eksekusi Cepat
Paket lambat menggunakan Brentozar Tempel paket
Cepat Rencana menggunakan Brentozar Tempel paket
Catatan: Kedua kueri itu sama (menggunakan parameter), satu-satunya perbedaan adalahEXISTS
(saya mungkin telah membuat beberapa kesalahan saat menganonimkan).
Skrip pembuatan tabel di bawah ini:
http://pastebin.com/CgSHeqXc - statistik tabel kecil
http://pastebin.com/GUu9KfpS - statistik tabel besar