Tôi chỉ tò mò tại sao một truy vấn tổng hợp chạy nhanh hơn nhiều với một GROUP BY
mệnh đề hơn là không có một truy vấn .
Ví dụ: truy vấn này mất gần 10 giây để chạy
SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1
Trong khi cái này mất ít hơn một giây
SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1
GROUP BY CreatedDate
Trong CreatedDate
trường hợp này chỉ có một , vì vậy truy vấn được nhóm trả về kết quả giống như truy vấn chưa được nhóm.
Tôi nhận thấy các kế hoạch thực hiện cho hai truy vấn là khác nhau - Truy vấn thứ hai sử dụng Parallelism trong khi truy vấn đầu tiên thì không.
Có phải bình thường máy chủ SQL sẽ đánh giá một truy vấn tổng hợp khác nhau nếu nó không có mệnh đề GROUP BY? Và tôi có thể làm gì để cải thiện hiệu năng của truy vấn thứ 1 mà không cần sử dụng GROUP BY
mệnh đề không?
Biên tập
Tôi vừa học được rằng tôi có thể sử dụng OPTION(querytraceon 8649)
để đặt chi phí chung của song song thành 0, điều này làm cho truy vấn sử dụng một số song song và giảm thời gian chạy xuống còn 2 giây, mặc dù tôi không biết liệu có bất kỳ nhược điểm nào khi sử dụng gợi ý truy vấn này không.
SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1
OPTION(querytraceon 8649)
Tôi vẫn thích thời gian chạy ngắn hơn vì truy vấn có nghĩa là đưa ra một giá trị theo lựa chọn của người dùng, vì vậy lý tưởng nhất là ngay lập tức giống như truy vấn được nhóm. Ngay bây giờ tôi chỉ gói gọn truy vấn của mình, nhưng tôi biết đó không thực sự là một giải pháp lý tưởng.
SELECT Min(CreatedDate)
FROM
(
SELECT Min(CreatedDate) as CreatedDate
FROM MyTable WITH (NOLOCK)
WHERE SomeIndexedValue = 1
GROUP BY CreatedDate
) as T
Chỉnh sửa # 2
Đáp lại yêu cầu của Martin để biết thêm thông tin :
Cả hai CreatedDate
và SomeIndexedValue
có một chỉ mục không duy nhất, không phân cụm trên chúng. SomeIndexedValue
thực sự là một trường varchar (7), mặc dù nó lưu một giá trị số trỏ đến PK (int) của một bảng khác. Mối quan hệ giữa hai bảng không được xác định trong cơ sở dữ liệu. Tôi hoàn toàn không phải thay đổi cơ sở dữ liệu và chỉ có thể viết các truy vấn truy vấn dữ liệu đó.
MyTable
chứa hơn 3 triệu bản ghi và mỗi bản ghi được gán một nhóm thuộc về ( SomeIndexedValue
). Các nhóm có thể là bất cứ nơi nào từ 1 đến 200.000 hồ sơ
MAXDOP
đặt mức độ song song tối đa, giới hạn số lượng bộ xử lý mà truy vấn có thể sử dụng. Điều này về cơ bản sẽ làm cho truy vấn thứ 2 chạy chậm như truy vấn thứ nhất, vì nó loại bỏ khả năng sử dụng song song, đó không phải là điều tôi muốn.