2011-01-20 43 views
6

Bất kỳ ai cũng có thể giúp tôi hiểu kế hoạch thực thi SQL Server cho các truy vấn sau không?Chức năng vô hướng SQL Server so với phân tích kế hoạch thực hiện truy vấn phụ

Tôi đã mong đợi phiên bản truy vấn phụ (Truy vấn 2) thực thi nhanh hơn, vì nó được đặt dựa trên. Điều này có vẻ như là khi chạy các truy vấn một cách độc lập - tuy nhiên - kế hoạch thực hiện cho thấy chi phí truy vấn là 15% so với 85% tương ứng:

//-- Query 1 (15%) - Scalar Function 
SELECT 
    gi.GalleryImageId, 
    gi.FbUserId, 
    dbo.GetGalleryImageVotesByGalleryImageId(gi.GalleryImageId) AS Votes 
FROM 
    GalleryImage gi 

//-- Query 2 (85%) - Subquery 
SELECT 
    gi.GalleryImageId, 
    gi.FbUserId, 
    (SELECT COUNT(*) FROM GalleryImageVote WHERE GalleryImageId = gi.GalleryImageId) 
FROM 
    GalleryImage gi 

Tôi thiếu gì ở đây; kế hoạch thực hiện có bỏ qua chi phí của hàm không? Ngoài ra, bất kỳ đề xuất nào về việc liệu một trong hai điều trên sẽ được phục vụ tốt hơn với truy vấn CTE hoặc OVER/PARTITION?

Cảm ơn bạn trước!

+0

Bạn có cả hai trong cùng một cửa sổ trình chỉnh sửa truy vấn không? Vì trình phân tích truy vấn sẽ so sánh chúng và chỉ định mỗi giá trị tương đối với giá trị trong cửa sổ (15%/85%). – JNK

+0

Có, đó là nơi giá trị% đến từ :) – Robarondaz

+0

Thời gian thực hiện truy vấn không phải lúc nào cũng bằng chi phí. SQL Server có vẻ như sử dụng CPU và RAM cao hơn HDD. – jahu

Trả lời

6

Không bao giờ tin tưởng vào Kế hoạch thực hiện. Đó là một rất hữu ích cho phép bạn xem những gì kế hoạch sẽ được, nhưng nếu bạn muốn số liệu thực tế, luôn lượt về thống kê

set statistics io on 
set statistics time on 

..và so sánh hành thực tế. Thống kê có thể nói rằng kỳ vọng là 15%/85%, nhưng thực tế sẽ cho bạn thấy những gì thực sự dịch.

Không có dấu đầu dòng bạc để điều chỉnh hiệu suất. Ngay cả các truy vấn "tốt nhất" có thể thay đổi theo thời gian khi hình dạng hoặc phân phối thay đổi dữ liệu của bạn.

CTE sẽ không khác nhiều và tôi không chắc chắn bạn dự định thực hiện truy vấn PARTITION như thế nào, nhưng bạn có thể thử biểu mẫu left join.

SELECT 
    gi.GalleryImageId, 
    gi.FbUserId, 
    count(v.GalleryImageId) AS Votes 
FROM 
    GalleryImage gi 
    LEFT JOIN GalleryImageVote v ON v.GalleryImageId = gi.GalleryImageId 
GROUP BY 
    gi.GalleryImageId, gi.FbUserId 
+0

Chúc mừng, tôi không biết về thống kê. Thời gian thực hiện thực tế là 265ms (Truy vấn 1) so với 2ms (Truy vấn 2); nhiều hơn nữa phù hợp với những gì tôi dự kiến ​​ban đầu! – Robarondaz

4

Trình tối ưu hóa không biết chi phí của hàm.

Bạn thể thấy CPU và Reads và Thời gian qua profiler dù

Một số câu trả lời liên quan từ những câu hỏi tương tự. OneTwo

  • chức năng bảng Inline mở rộng vào truy vấn chính (họ là macro như lượt xem)
  • vô hướng (một của bạn) và đa chức năng bảng tuyên bố không và hộp đen cho "bên ngoài" truy vấn
+0

Cảm ơn sự giúp đỡ của bạn! – Robarondaz

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