Tại sao toán tử Parallelism (Luồng phân phối lại) sẽ giảm các ước tính hàng xuống còn 1?


12

Tôi đang sử dụng SQL Server 2012 Enterprise. Tôi đã bắt gặp một Kế hoạch SQL đang thể hiện một số hành vi mà tôi không thấy hoàn toàn trực quan. Sau một hoạt động Quét chỉ mục song song nặng nề, hoạt động Parallelism (Luồng phát lại) xảy ra, nhưng nó đang giết chết các ước tính hàng được trả về bởi Quét quét (Object10.Index2), giảm ước tính xuống 1. Tôi đã thực hiện một số tìm kiếm, nhưng đã không bắt gặp bất cứ điều gì giải thích hành vi này. Truy vấn khá đơn giản, mặc dù mỗi bảng chứa các bản ghi trong hàng triệu thấp. Đây là một phần của quy trình tải DWH và bộ dữ liệu trung gian này được chạm vào một vài lần trong suốt, nhưng câu hỏi tôi có liên quan đến các ước tính hàng nói riêng. Ai đó có thể giải thích tại sao ước tính hàng chính xác đi đến 1 trong Toán tử Parallelism (Repartition Strems) không? Cũng thế,

Tôi đã đăng toàn bộ kế hoạch để Dán Kế hoạch .

Đây là hoạt động trong câu hỏi:

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

Bao gồm Cây kế hoạch trong trường hợp thêm bất kỳ bối cảnh nào:

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

Tôi có thể chạy vào một số biến thể của mục Kết nối này được gửi bởi Paul White (tìm hiểu sâu hơn về blog của anh ấy ở đây ) không? Ít nhất đó là điều duy nhất tôi thấy dường như thậm chí còn gần với những gì tôi đang gặp phải mặc dù không có nhà điều hành TOP nào đang chơi.

Câu trả lời:


9

Các kế hoạch truy vấn với các bộ lọc bitmap đôi khi có thể khó đọc. Từ bài viết BOL cho các luồng phân vùng (nhấn mạnh của tôi):

Toán tử Repartition Streams tiêu thụ nhiều luồng và tạo ra nhiều luồng bản ghi. Các nội dung và định dạng hồ sơ không được thay đổi. Nếu trình tối ưu hóa truy vấn sử dụng bộ lọc bitmap, số lượng hàng trong luồng đầu ra sẽ giảm.

Ngoài ra, một bài viết về bộ lọc bitmap cũng hữu ích:

Khi phân tích một kế hoạch thực hiện có chứa lọc bitmap, điều quan trọng là phải hiểu cách dữ liệu chảy qua kế hoạch và nơi áp dụng lọc. Bộ lọc bitmap và bitmap được tối ưu hóa được tạo ở phía đầu vào bản dựng (bảng thứ nguyên) của phép nối băm; tuy nhiên, quá trình lọc thực tế thường được thực hiện trong toán tử Parallelism, nằm ở phía đầu vào của đầu dò (bảng thực tế) của phép nối băm. Tuy nhiên, khi bộ lọc bitmap dựa trên một cột số nguyên, bộ lọc có thể được áp dụng trực tiếp vào bảng ban đầu hoặc hoạt động quét chỉ mục thay vì toán tử Parallelism. Kỹ thuật này được gọi là tối ưu hóa liên tiếp.

Tôi tin rằng đó là những gì bạn đang quan sát với truy vấn của bạn. Có thể đưa ra một bản demo tương đối đơn giản để hiển thị toán tử luồng phân vùng lại làm giảm ước tính cardinality, ngay cả khi toán tử bitmap IN_ROWchống lại bảng thực tế. Chuẩn bị dữ liệu:

create table outer_tbl (ID BIGINT NOT NULL);

INSERT INTO outer_tbl WITH (TABLOCK)
SELECT TOP (1000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM master..spt_values;

create table inner_tbl_1 (ID BIGINT NULL);
create table inner_tbl_2 (ID BIGINT NULL);

INSERT INTO inner_tbl_1 WITH (TABLOCK)
SELECT (ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) / 2000000 - 2) NUM
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

INSERT INTO inner_tbl_2 WITH (TABLOCK)
SELECT (ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) / 2000000 - 2) NUM
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

Đây là một truy vấn mà bạn không nên chạy:

SELECT *
FROM outer_tbl o
INNER JOIN inner_tbl_1 i ON o.ID = i.ID
INNER JOIN inner_tbl_2 i2 ON o.ID = i2.ID
OPTION (HASH JOIN, QUERYTRACEON 9481, QUERYTRACEON 8649);

Tôi đã tải lên kế hoạch . Hãy nhìn vào các nhà điều hành gần inner_tbl_2:

phân vùng mất hàng

Bạn cũng có thể thấy thử nghiệm thứ hai trong Hash Joins trên Nullable Cột của Paul White hữu ích.

Có một số mâu thuẫn trong cách áp dụng giảm hàng. Tôi chỉ có thể nhìn thấy nó trong một kế hoạch với ít nhất ba bảng. Tuy nhiên, việc giảm các hàng dự kiến ​​có vẻ hợp lý với phân phối dữ liệu phù hợp. Giả sử rằng cột đã tham gia trong bảng thực tế có nhiều giá trị lặp lại không có trong bảng thứ nguyên. Bộ lọc bitmap có thể loại bỏ các hàng đó trước khi chúng tham gia. Đối với truy vấn của bạn, ước tính được giảm xuống còn 1. Cách các hàng được phân phối giữa hàm băm cung cấp một gợi ý hay:

phân phối hàng

Dựa vào đó tôi nghi ngờ rằng bạn có rất nhiều giá trị lặp lại cho Object1.Column21cột. Nếu các cột lặp lại xảy ra không có trong biểu đồ thống kê Object4.Column19thì SQL Server có thể nhận được ước tính cardinality rất sai.

Tôi nghĩ rằng bạn nên quan tâm đến việc có thể cải thiện hiệu năng của truy vấn. Tất nhiên, nếu truy vấn đáp ứng yêu cầu về thời gian đáp ứng hoặc SLA thì có thể không cần điều tra thêm. Tuy nhiên, nếu bạn muốn điều tra thêm, có một số điều bạn có thể làm (ngoài việc cập nhật số liệu thống kê) để có ý tưởng về việc trình tối ưu hóa truy vấn sẽ chọn một kế hoạch tốt hơn nếu có thông tin tốt hơn. Bạn có thể đặt kết quả của phép nối giữa Database1.Schema1.Object10Database1.Schema1.Object11vào một bảng tạm thời và xem liệu bạn có tiếp tục nhận được các phép nối vòng lặp lồng nhau không. Bạn có thể thay đổi tham gia đó thành một LEFT OUTER JOINtrình tối ưu hóa truy vấn sẽ không làm giảm số lượng hàng tại bước đó. Bạn có thể thêm một MAXDOP 1gợi ý cho truy vấn của bạn để xem điều gì xảy ra. Bạn đã có thể sử dụngTOPcùng với một bảng dẫn xuất để buộc tham gia đi cuối cùng, hoặc thậm chí bạn có thể nhận xét tham gia từ truy vấn. Hy vọng rằng những gợi ý này là đủ để bạn bắt đầu.

Liên quan đến mục kết nối trong câu hỏi, rất khó có khả năng nó liên quan đến câu hỏi của bạn. Vấn đề đó không liên quan đến ước tính hàng kém. Nó phải làm với một điều kiện cuộc đua song song khiến quá nhiều hàng được xử lý trong kế hoạch truy vấn phía sau hậu trường. Ở đây có vẻ như truy vấn của bạn không làm thêm bất kỳ công việc nào.


6

Vấn đề cốt lõi ở đây là ước tính số lượng thẻ kém cho kết quả của lần tham gia đầu tiên. Điều này có thể phát sinh vì nhiều lý do, nhưng thường xuyên nhất là do thống kê lỗi thời hoặc một số biến vị ngữ tham gia tương quan, mà mô hình mặc định của trình tối ưu hóa là độc lập.

Trong trường hợp sau, FIX: Hiệu suất kém khi bạn chạy truy vấn có chứa các vị từ AND tương quan trong SQL Server 2008 hoặc SQL Server 2008 R2 hoặc SQL Server 2012 có thể có liên quan bằng cách sử dụng cờ theo dõi được hỗ trợ 4137. Bạn cũng có thể thử truy vấn với cờ theo dõi 4199 để cho phép sửa lỗi tối ưu hóa và / hoặc 2301 để bật mô hình mở rộng. Thật khó để biết trên cơ sở một kế hoạch ẩn danh.

Sự hiện diện của bitmap không ảnh hưởng trực tiếp đến ước tính cardinality của phép nối, nhưng nó làm cho hiệu quả của nó được nhìn thấy sớm hơn bằng cách áp dụng giảm semijoin sớm. Nếu không có bitmap, ước tính cardinality cho lần tham gia đầu tiên sẽ giống nhau và phần còn lại của kế hoạch vẫn sẽ được tối ưu hóa tương ứng.

Nếu bạn tò mò, trên hệ thống kiểm tra, bạn có thể vô hiệu hóa bitmap cho truy vấn bằng cờ theo dõi 7498. Bạn cũng có thể vô hiệu hóa bitmap được tối ưu hóa (được xem xét bởi trình tối ưu hóa và ảnh hưởng đến ước tính cardinality), thay thế chúng bằng bitmap tối ưu hóa sau (không được xem xét bởi trình tối ưu hóa, không ảnh hưởng đến cardinality) với sự kết hợp của cờ theo dõi 7497 và 7498. Không được ghi lại hoặc hỗ trợ để sử dụng trên hệ thống sản xuất, nhưng chúng tạo ra các kế hoạch mà trình tối ưu hóa có thể xem xét bình thường, và do đó có thể bị ép buộc với hướng dẫn kế hoạch.

Không ai trong số này sẽ giải quyết vấn đề cốt lõi của ước tính kém cho lần tham gia đầu tiên như đã lưu ý ở trên, vì vậy tôi thực sự chỉ đề cập đến nó vì lợi ích.

Đọc thêm về bitmap và tham gia băm:


0

trả lời bạn trên Twitter. Tôi nhìn vào XML đính kèm và thấy sự song song không cân bằng. 1 luồng có gần như tất cả các hàng thực tế trong khi hầu hết các hàng khác thì không. Đó là tiếng hét song song không cân bằng đang xảy ra. Do đó, tôi sẽ xem xét giá trị khóa / tham gia và số liệu thống kê & thẻ tương ứng của nó.

Theo ý tưởng khác của bạn, tôi không chắc chắn rằng mục Kết nối được áp dụng, vì gói đã dán của bạn không chứa TOP ở bất cứ đâu tôi thấy.

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.