Tôi đang cố gắng tối ưu hóa một truy vấn SQL phức tạp và nhận được các kết quả cực kỳ khác nhau khi tôi thực hiện các thay đổi dường như không quan trọng.Câu đố hiệu suất truy vấn T-SQL: Tại sao sử dụng biến làm nên sự khác biệt?
Ví dụ, điều này mất 336 mili giây để chạy:
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;
Nếu tôi thay thế @InstanceID với một số mã hóa cứng, phải mất hơn 13 giây (13.890 ms) để chạy:
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;
Trong các trường hợp khác, tôi nhận được hiệu ứng ngược lại chính xác: Ví dụ: sử dụng biến @s thay cho chữ 'john' làm cho truy vấn chạy chậm hơn theo thứ tự độ lớn.
Ai đó có thể giúp tôi kết hợp điều này với nhau không? Khi nào một biến làm cho mọi thứ nhanh hơn, và khi nào nó làm cho mọi thứ chậm hơn?
Bạn nhận ra rằng sử dụng 'TOP 20' và di chuyển ORDER BY từ ROW_NUMBER có nghĩa là bạn không cần CTE? –
@OMG: chỉ khi những con số đó không bao giờ thay đổi - nếu anh ta muốn nhận hàng 800 - 820, phương pháp CTE nhanh hơn nhiều –
@OMG: @Gabriel là đúng, điều này được sử dụng để phân phối kết quả phân trang, vì vậy nó có thể là 'Row giữa 20 và 40', v.v. –