Tại sao Phiên bản truy vấn 2 nhanh hơn rất nhiều?Tại sao một truy vấn thực thi nhanh hơn nhiều khi tôi (theo cách thủ công) lưu vào bộ nhớ cache kết quả của hàm bảng có giá trị trong bảng tạm thời?
Tôi nghi ngờ DB Engine đang gọi hàm Table-Valued-Function "GetUsageStatistic" nhiều lần, vậy có cách nào để báo cho động cơ biết rằng "GetUsageStatistic" là xác định và chỉ nên gọi một lần không?
Version Query 1
--Takes ~10 minutes
select *
from RosterLevel r
left join GetUsageStatistics(@mindate, @maxdate) usage on r.UserID = usage.UserID;
Query Version 2
--Takes ~10 seconds
select * into #usage from GetUsageStatistics(@mindate, @maxdate);
select *
from RosterLevel r
left join #usage on r.UserID = #usage.UserID;
Cơ thể của 'GetUsageStatistics' trông như thế nào? Có một truy vấn đơn lẻ hoặc nhiều truy vấn dẫn đến một kết quả đơn lẻ không? –
GetUsageStatistics là hàm inline-table-valued (ITVF), được chọn từ GetWeeklyUsage, chính nó là một ITVF được chọn từ GetDailyUsage (cũng là một ITVF). Về cơ bản, nó là một chuỗi các ITVF xác định đơn giản mà mỗi hàm trả về một mức kết quả tổng hợp với hàm SUM, AVG và COUNT trong các cột đầu ra của chúng. – Triynko
@Triynko - chắc chắn có giá trị nhận được Kế hoạch thực thi thực tế cho cả hai truy vấn và so sánh chúng để xem liệu việc thực hiện nhiều lý thuyết TVF của bạn có đúng hay không. –