bất cứ ai có thể giúp tôi với kế hoạch truy vấn khủng khiếp này?


7

Truy vấn:

    SELECT Object1.Column1, Object2.Column2 AS Column3, Object2.Column4 AS Column5, 
Object3.Column6, Object3.Column7,Object1.Column8, Object1.Column9, 
Object1.Column10, Object1.Column11, Object1.Column12, Object1.Column13, 
Object1.Column14, Object1.Column15 as Column15, Object1.Column16, 
Object4.Column4 AS Column17, Object4.Column2 AS Column18, Object1.Column19,
 Object1.Column20, Object1.Column21, Object1.Column22, Object1.Column23, 
Object1.Column24, Object1.Column25, Object1.Column26, Object5.Column4, 
Object1.Column27, Object1.Column28, Object1.Column29, Object3.Column30, 
Object3.Column1 as Column31, Object3.Column32 as Column33, Object1.Column34 
as Column34, ? AS Column35 , Object3.Column36 as Column37 
FROM Object6 AS Object1 
INNER JOIN Object7 AS Object3 ON Object1.Column38 = Object3.Column1 
INNER JOIN Object8 AS Object2 ON Object3.Column30 = Object2.Column1 
LEFT JOIN Object9 AS Object4 ON Object1.Column16 = Object4.Column2 
LEFT JOIN Object10 AS Object5 ON Object1.Column9 = Object5.Column2 
WHERE Object2.Column1 <> ? AND Object1.Column8 = ? 
AND ( coalesce(Column16,?)= ? ) 
AND EXISTS (
         SELECT ? 
         FROM Object11 
         WHERE Column39 = ? 
         AND Column30 = Object3.Column30) 
ORDER BY Column7 desc
OFFSET ? ROWS FETCH FIRST ? ROWS ONLY

đây là kế hoạch truy vấn

Tôi biết rằng tôi có thể nên thêm một chỉ mục về điều này:

Cơ sở dữ liệu1.Schema1.Object7.Column30, Cơ sở dữ liệu1.Schema1.Object7.Column36, Cơ sở dữ liệu1.Schema1.Object7.Column6, Cơ sở dữ liệu1.Schema1.Object7.Column32

nhưng một trong những cột này là một varchar 4000 và nó không thể được tạo ra do kích thước lớn của trường.

Tôi nhận thấy rằng chỉ mất 25 giây nếu các hàng được trả về ít hơn số đầu tiên tìm nạp


Xin chào, hãy thử thêm OPTION(FORCE ORDER) vào truy vấn của bạn
Denis Rubashkin

Câu trả lời:


9

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

Kế hoạch thực hiện truy cập Object7đầu tiên bằng cách sử dụng một chỉ mục không bao gồm theo Column7thứ tự. Sau đó, nó thực hiện một số tra cứu quan trọng trên bảng đó và các vòng lặp lồng nhau kết hợp với các bảng khác với kết quả cuối cùng được kết nối đến TOPtoán tử vẫn được yêu cầu bởi Column7.

Một khi điều này đã nhận đủ các hàng để đáp ứng, OFFSET ... FETCHnó có thể ngừng yêu cầu thêm bất kỳ hàng nào từ các toán tử xuôi dòng. SQL Server ước tính rằng nó sẽ chỉ cần đọc 2419 hàng từ chỉ mục ban đầu Object7.Column7trước khi đến thời điểm này.

Ước tính này hoàn toàn không đúng. Trong thực tế, nó kết thúc bằng việc đọc toàn bộ Object7và có khả năng hết hàng trước khi OFFSET ... FETCHthỏa mãn.

Việc tham gia bán kết hợp Object11làm giảm gần một nửa số người giết người nhưng kẻ giết người là tham gia Object6và dự đoán trên cùng một bảng. Cùng nhau làm giảm các 9,753,116hàng đi ra từ semijoin đến 2.

Bạn có thể thử dành một chút thời gian để xem số liệu thống kê trên các bảng có liên quan để thử và lấy ước tính số lượng thẻ từ các tham gia này để chính xác hơn hoặc thay vào đó bạn có thể thêm OPTION (USE HINT ('DISABLE_OPTIMIZER_ROWGOAL') )để kế hoạch được chi phí mà không cần giả định rằng nó có thể dừng sớm do OFFSET ... FETCH- điều này chắc chắn sẽ cung cấp cho bạn một kế hoạch khác.


1

Nếu bạn có thể thêm một chỉ mục trên Object11, Cột39 + Cột30 và một chỉ mục trên Object7, Cột 30, với các trường khác từ Object7 trong INCLUDEphần của CREATE INDEXcâu lệnh cho Object 7, bạn sẽ có hiệu suất tăng cao. Đây là phần lớn chi phí tài nguyên liên quan đến truy vấn này.

Dựa trên XML của kế hoạch, chúng có vẻ gần với các chỉ mục tối ưu cho truy vấn này:

CREATE INDEX Idx_Object11_Column39_Column30
ON Object11(Column39_Column30)

CREATE INDEX Idx_Object7_Column30_Column1_Includes
ON Object7 (Column30, Column1)
INCLUDE (Column7, Column36, Column6, Column2)
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.