Estoy tratando de optimizar una consulta SQL compleja y obtener resultados tremendamente diferentes cuando hago cambios aparentemente insignificantes.Problema en la consulta de T-SQL: ¿Por qué el uso de una variable hace la diferencia?
Por ejemplo, esto se lleva a 336 ms para ejecutar:
Declare @InstanceID int set @InstanceID=1;
With myResults as (
Select
Row = Row_Number() Over (Order by sv.LastFirst),
ContactID
From DirectoryContactsByContact(1) sv
Join ContainsTable(_s_Contacts, SearchText, 'john') fulltext on (fulltext.[Key]=ContactID)
Where IsNull(sv.InstanceID,1) = @InstanceID
and len(sv.LastFirst)>1
) Select * From myResults Where Row between 1 and 20;
Si sustituyo el @InstanceID con un número codificado, se tarda más de 13 segundos (13890 ms) para ejecutar:
Declare @InstanceID int set @InstanceID=1;
With myResults as (
Select
Row = Row_Number() Over (Order by sv.LastFirst),
ContactID
From DirectoryContactsByContact(1) sv
Join ContainsTable(_s_Contacts, SearchText, 'john') fulltext on (fulltext.[Key]=ContactID)
Where IsNull(sv.InstanceID,1) = 1
and len(sv.LastFirst)>1
) Select * From myResults Where Row between 1 and 20;
En otros casos obtengo el efecto exactamente opuesto: por ejemplo, el uso de una variable @s en lugar del literal 'john' hace que la consulta se ejecute más lentamente en un orden de magnitud.
¿Alguien me puede ayudar a unir esto? ¿Cuándo una variable hace las cosas más rápido y cuándo las hace más lentas?
Se da cuenta de que el uso de '20' TOP y moviendo el ORDER BY de la ROW_NUMBER significa que no es necesario el CTE? –
@OMG: solo si esos números nunca cambian - si quiere obtener las filas 800 - 820, el método CTE es mucho más rápido –
@OMG: @Gabriel tiene razón, esto se usa para entregar resultados paginados, por lo que podría ser 'Fila entre 20 y 40 ', etc. –