Я пытаюсь оптимизировать сложный 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" заставляет запрос запускаться медленнее на порядок.
Может кто-нибудь помочь мне связать это вместе? Когда переменная делает вещи быстрее, и когда она делает вещи медленнее?