10

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; 
+0

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? –

+0

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

+0

@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. –

Trả lời

1

Như đã đề cập trong các ý kiến, câu trả lời tốt nhất là để phân tích bất cứ kế hoạch thực hiện được nhổ ra. Nói cách đó, trực giác của bạn có lẽ đúng, nhưng ngoài SQL Server tự động lưu trữ bất cứ thứ gì, sẽ không có nhiều đầu vào theo gợi ý truy vấn mà bạn có thể cung cấp để chỉ ra rằng hàm này là xác định, nhưng bạn có thể thử một số điều được đề cập trong số Query Hints MSDN page. Thử nghiệm đầu tiên của tôi có thể sẽ vẽ trên Table Hints.

+0

Thẻ "SQL" có phải là thẻ của Microsoft không? – Tim

+1

@Tim: Không. Tuy nhiên, nhiều người dường như đã nhầm lẫn nó vì vậy, như một vấn đề của thực tế. Một lý do khác để giả sử SQL Server có thể là kịch bản của OP rõ ràng là T-SQL (từ '#' -names). Nhưng có lẽ lý do thực sự là OP đã đề cập đến SSMS trong một trong những ý kiến ​​của họ. –

+0

@Tim: @Andriy loại quyền - 'rõ ràng' là chủ đề mặc dù, vì nó chỉ áp dụng cho những người đã biết TSQL trông như thế nào, và SSMS đó là MS. Nhưng như vậy thì thầm sang một bên :-), bạn nói đúng, đây không phải là một câu hỏi SQL chung, đó là một câu hỏi TSQL, và điều đó tạo ra sự khác biệt xa như ai có thể trả lời nó, và ai sẽ quan tâm tìm kiếm nó/đọc nó ở nơi đầu tiên. – Chains

0

Nếu bạn sử dụng hàm trong ví dụ đầu tiên, nó được gọi nhiều lần - một lần cho mỗi bản ghi trong bảng RosterLevel của bạn. Nó trả về một bảng (có khả năng) khác nhau mỗi lần, tùy thuộc vào trường nối.

Nếu bạn sử dụng hàm trong ví dụ thứ hai của bạn, nó chỉ được gọi một lần. Từ đó, biến bảng nằm trong bộ nhớ, và bạn không phải thực hiện đọc nhiều lần.

Các vấn đề liên quan