Tengo la siguiente consulta:
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 consulta anterior se completa en tres segundos.
Si la consulta anterior devuelve algún valor, queremos que el procedimiento almacenado salga, así que lo reescribí como a continuación:
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
Sin embargo, esto está tomando 10 minutos.
Puedo reescribir la consulta anterior como a continuación, que también se completa en menos de 3 segundos:
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
El problema con la reescritura anterior es que la consulta anterior es parte de un procedimiento almacenado más grande y devuelve múltiples conjuntos de resultados. En C #, iteramos a través de cada conjunto de resultados y realizamos algunos procesamientos.
Lo anterior devuelve un conjunto de resultados vacío, por lo que si sigo este enfoque, tengo que cambiar mi C # y volver a implementar.
Entonces mi pregunta es:
¿Por qué usar solo
IF EXISTS
cambia el plan para tomar tanto tiempo?
A continuación se encuentran los detalles que pueden ayudarlo y avíseme si necesita algún detalle:
- Crear tabla y script de estadísticas para obtener el mismo plan que el mío
- Plan de ejecución lenta
Plan de ejecución rápida
Plan lento con Brentozar Pegar el plan
Plan rápido con Brentozar Pegar el plan
Nota: Ambas consultas son iguales (usando parámetros), la única diferencia es EXISTS
(aunque podría haber cometido algunos errores al anonimizar).
Los scripts de creación de tablas están a continuación:
http://pastebin.com/CgSHeqXc - estadísticas de mesa pequeña
http://pastebin.com/GUu9KfpS - estadísticas de mesa grande