Truy vấn này chạy trong ~ 21 giây ( kế hoạch thực hiện ):
select
a.month
, count(*)
from SubqueryTest a
where a.year = (select max(b.year) from SubqueryTest b)
group by a.month
Khi truy vấn con được thay thế bằng một biến, nó sẽ chạy trong <1 giây ( kế hoạch thực hiện ):
declare @year float
select @year = max(b.year) from SubqueryTest b
select
month
, count(*)
from SubqueryTest where year = @year group by month
Đánh giá từ kế hoạch thực hiện, lựa chọn phụ "select max ..." được chạy cho mỗi hàng triệu hàng trong "SubqueryTest a:, đó là lý do tại sao phải mất nhiều thời gian như vậy.
Câu hỏi của tôi: Vì lựa chọn phụ là vô hướng, xác định và không tương quan, tại sao trình tối ưu hóa truy vấn không làm những gì tôi đã làm trong ví dụ thứ hai của mình và chạy truy vấn con một lần, lưu trữ kết quả, sau đó sử dụng nó cho truy vấn chính? Tôi chắc chắn rằng có một lỗ hổng trong sự hiểu biết của tôi về SQL Server, nhưng tôi thực sự muốn trợ giúp để lấp đầy nó - một vài giờ với google đã không giúp được gì.
Bảng chỉ hơn 1gb với gần 28 triệu bản ghi:
CREATE TABLE SubqueryTest(
[pk_id] [int] IDENTITY(1,1) NOT NULL
, [Year] [float] NULL
, [Month] [float] NULL PRIMARY KEY CLUSTERED ([pk_id] ASC))
CREATE NONCLUSTERED INDEX idxSubqueryTest ON SubqueryTest ([Year] ASC)
Year
như phao. Xin lỗi, không, điều đó có ý nghĩa với Stardates . NhưngMonth
như phao? Thực sự đệm tôi.