Ho la seguente domanda:
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)
La query precedente viene completata in tre secondi.
Se la query sopra restituisce un valore, vogliamo che la procedura memorizzata ESCI, quindi la riscrivo come di seguito:
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
Tuttavia, ci vogliono 10 minuti.
Posso riscrivere la query precedente come di seguito, che si completa anche in meno di 3 secondi:
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
Il problema con la riscrittura sopra è che la query sopra fa parte di una procedura memorizzata più grande e restituisce più set di risultati. In C #, passiamo in rassegna ogni set di risultati e eseguiamo alcune elaborazioni.
Quanto sopra restituisce un set di risultati vuoto, quindi se seguo questo approccio, devo cambiare il mio C # ed eseguire di nuovo la distribuzione.
Quindi la mia domanda è
perché usare semplicemente
IF EXISTS
cambia il piano per richiedere così tanto tempo?
Di seguito sono riportati i dettagli che potrebbero esserti utili e fammi sapere se hai bisogno di ulteriori dettagli:
- Crea uno script di tabelle e statistiche per ottenere lo stesso piano del mio
- Piano di esecuzione lento
Piano di esecuzione rapida
Piano lento usando Brentozar Incolla il piano
Piano veloce usando Brentozar Incolla il piano
Nota: entrambe le query sono uguali (utilizzando i parametri), l'unica differenza è EXISTS
(potrei aver commesso degli errori durante l'anonimizzazione).
Gli script di creazione della tabella sono di seguito:
http://pastebin.com/CgSHeqXc - statistiche per piccoli tavoli
http://pastebin.com/GUu9KfpS - statistiche per grandi tavoli