Hãy nói rằng bạn có một cái nhìn:Tại sao đặt một mệnh đề WHERE bên ngoài xem có hiệu suất khủng khiếp
CREATE VIEW dbo.v_SomeJoinedTables AS
SELECT
a.date,
a.Col1,
b.Col2,
DENSE_RANK()
OVER(PARTITION BY a.date, a.Col2 ORDER BY a.Col3) as Something
FROM a JOIN b on a.date = b.date
tôi đã tìm thấy rằng hiệu suất của:
SELECT *
FROM v_SomeJoinedTables
WHERE date > '2011-01-01'
là tồi tệ hơn nhiều so với
SELECT *,
DENSE_RANK()
OVER(PARTITION BY a.date, a.Col2 ORDER BY a.Col3) as Something
FROM a JOIN b ON a.date = b.date
WHERE a.date > '2011-01-01'
Tôi rất ngạc nhiên khi kế hoạch truy vấn cho hai câu lệnh này không giống nhau.
Tôi cũng đã thử sử dụng hàm nội tuyến có giá trị, nhưng truy vấn vẫn mất 100-1000 lần dài hơn mã tôi sao chép và dán logic chế độ xem.
Bất kỳ ý tưởng nào?
Vâng, kế hoạch truy vấn trông như thế nào? Bạn có thiếu chỉ mục không? Chế độ xem có trả lại quá nhiều hàng không? Nếu mệnh đề where được áp dụng ở vị trí sai? –
Chế độ xem của bạn có đang được gọi là chế độ xem không? – HLGEM
Điều gì xảy ra nếu chế độ xem của bạn không chứa chức năng cửa sổ? Kết quả ngữ nghĩa dự kiến của một VIEW tính toán thứ hạng trên toàn bộ tập hợp là gì, nhưng truy vấn cho chế độ xem sẽ thêm điều kiện mới - liệu RANK insde có được áp dụng trước hoặc sau điều kiện bên ngoài không? – ErikE