Я пытаюсь оптимизировать сложный SQL-запрос и получаю совершенно разные результаты, когда делаю, казалось бы, несущественные изменения.
Например, для запуска требуется 336 мс:
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;
Если я заменю @InstanceID жестко запрограммированным числом, для запуска потребуется более 13 секунд (13890 мс):
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;
В других случаях я получаю прямо противоположный эффект: например, использование переменной @s вместо литерала 'john' заставляет запрос выполняться медленнее на порядок.
Может ли кто-нибудь помочь мне связать это вместе? Когда переменная ускоряет, а когда замедляет?