Tại sao gợi ý READPAST khiến các lượt xem được lập chỉ mục bị bỏ qua?


10

Tôi đang điều tra bằng cách sử dụng READPASTgợi ý để giảm việc khóa tài nguyên trong hệ thống con tài chính của ứng dụng của chúng tôi.

Có vẻ như là một cách tốt để đi vì hồ sơ giao dịch tài chính chỉ được thêm vào, không bao giờ được cập nhật hoặc xóa. Các hàng duy nhất từng bị bỏ qua là các hàng hoàn toàn mới được chèn bên trong giao dịch; họ thực sự không tồn tại với thế giới bên ngoài cho đến khi giao dịch được thực hiện.

Tuy nhiên, tôi nhận thấy hiệu suất kém hơn đối với các truy vấn sử dụng các chế độ xem được lập chỉ mục mà tôi đã đưa ra READPASTgợi ý. So sánh các kế hoạch truy vấn, có vẻ như với gợi ý, trình tối ưu hóa truy vấn chọn không sử dụng chế độ xem được lập chỉ mục và thay vào đó lại quay lại coi nó như một chế độ xem thông thường.

Tôi không chắc tại sao lại như vậy; Tôi tưởng tượng các khung nhìn được lập chỉ mục giống như bất kỳ chỉ mục nào khác trong đó các khóa có thể bị khóa trong các hoạt động và việc thêm READPASTsẽ hoạt động tương tự.

SELECT TOP 1 isa.InvoiceId
FROM Financial_InvoiceSummaryAmounts isa WITH (READPAST)
WHERE isa.TotalOwedAmount = 0.0

nhập mô tả hình ảnh ở đây

SELECT TOP 1 isa.InvoiceId
FROM Financial_InvoiceSummaryAmounts isa
WHERE isa.TotalOwedAmount = 0.0

nhập mô tả hình ảnh ở đây

Thêm một NOEXPANDgợi ý cũng có vẻ hiệu quả, nhưng tôi quan tâm đến việc tìm hiểu thêm về lý do có thể READPASTkhiến trình tối ưu hóa truy vấn đưa ra lựa chọn đó ngay từ đầu (như một phần của câu trả lời đầy đủ).

Câu trả lời:


7

Sử dụng lại bảng ví dụ và chế độ xem được lập chỉ mục từ bài viết của tôi Một lý do khác để sử dụng NOEXPANDgợi ý trong Phiên bản doanh nghiệp :

CREATE TABLE dbo.T
(
    col1 integer NOT NULL
);
GO
INSERT dbo.T WITH (TABLOCKX)
    (col1)
SELECT 
    SV.number
FROM master.dbo.spt_values AS SV
WHERE 
    SV.type = N'P';
GO
CREATE VIEW dbo.VT
WITH SCHEMABINDING
AS
SELECT T.col1 
FROM dbo.T AS T;

Repro

Truy vấn này khớp với chế độ xem được lập chỉ mục (mặc dù có tổng hợp dự phòng):

SELECT DISTINCT
    VT.col1 
FROM dbo.VT AS VT;

Chế độ xem được lập chỉ mục phù hợp

Thêm một READPASTgợi ý kết quả trong việc truy cập bảng cơ sở:

SELECT DISTINCT
    VT.col1 
FROM dbo.VT AS VT 
    WITH (READPAST);

Chế độ xem được lập chỉ mục không khớp

Giải trình

Các READPASTgợi ý là ngữ nghĩa-ảnh hưởng. Trình tối ưu hóa chống lại việc viết lại các truy vấn sao cho kết quả thay đổi. Để minh họa:

Các truy vấn sau đây thực hiện mà không có vấn đề:

SELECT DISTINCT
    VT.col1 
FROM dbo.VT AS VT 
    WITH (READPAST);

Tuy nhiên:

SELECT DISTINCT
    VT.col1 
FROM dbo.VT AS VT 
    WITH (READPAST)
OPTION 
    (TABLE HINT (VT, FORCESCAN));

Tạo ra lỗi:

Msg 8722, Cấp 16, Bang 1, Dòng 42
Không thể thực hiện truy vấn.
Gợi ý ảnh hưởng ngữ nghĩa 'readpast' xuất hiện trong mệnh đề 'VỚI' của đối tượng 'VT'
nhưng không có trong mệnh đề 'TABLE HINT' tương ứng.
Thay đổi mệnh đề TÙY CHỌN (TABLE HINTS ...) để gợi ý ảnh hưởng ngữ nghĩa
phù hợp với mệnh đề CÓ.

Khi bạn tham chiếu chế độ xem được lập chỉ mục mà không có NOEXPANDgợi ý, chế độ xem được mở rộng (trước khi quá trình biên dịch và tối ưu hóa bắt đầu) để tham chiếu các đối tượng cơ bản thay thế. Sau đó trong quá trình, trình tối ưu hóa có thể xem xét việc khớp cây truy vấn trở lại chế độ xem được lập chỉ mục, toàn bộ hoặc một phần.

Khi READPASTđược sử dụng mà không có NOEXPAND, gợi ý sẽ lan truyền đến bảng cơ sở, ngăn việc khớp khung nhìn (các ngữ nghĩa khác nhau).

Với NOEXPAND, gợi ý áp dụng cho chế độ xem trực tiếp, vì vậy không có vấn đề gì.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.