SQL Server 2014 COUNT (DISTINCT x) bỏ qua vectơ mật độ thống kê cho cột x


15

Đối với một COUNT(DISTINCT)giá trị có ~ 1 tỷ giá trị riêng biệt, tôi đang nhận một gói truy vấn với tổng số băm ước tính chỉ có ~ 3 triệu hàng.

Tại sao chuyện này đang xảy ra? SQL Server 2012 tạo ra một ước tính tốt, vậy đây có phải là một lỗi trong SQL Server 2014 mà tôi nên báo cáo về Connect không?

Các truy vấn và ước tính kém

-- Actual rows: 1,011,719,166
-- SQL 2012 estimated rows: 1,079,130,000 (106% of actual)
-- SQL 2014 estimated rows: 2,980,240 (0.29% of actual)
SELECT COUNT(DISTINCT factCol5)
FROM BigFactTable
OPTION (RECOMPILE, QUERYTRACEON 9481) -- Include this line to use SQL 2012 CE

-- Stats for the factCol5 column show that there are ~1 billion distinct values
-- This is a good estimate, and it appears to be what the SQL 2012 CE uses
DBCC SHOW_STATISTICS (BigFactTable, _WA_Sys_00000005_24927208)
--All density   Average Length  Columns
--9.266754E-10  8               factCol5
SELECT 1 / 9.266754E-10
-- 1079126520.46229

Kế hoạch truy vấn

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

Kịch bản đầy đủ

Dưới đây là toàn bộ nội dung của tình huống sử dụng cơ sở dữ liệu chỉ thống kê .

Những gì tôi đã cố gắng cho đến nay

Tôi đã đi sâu vào các số liệu thống kê cho cột có liên quan và thấy rằng vectơ mật độ cho thấy ước tính ~ 1,1 tỷ giá trị khác biệt. SQL Server 2012 sử dụng ước tính này và tạo ra một kế hoạch tốt. Thật đáng ngạc nhiên, SQL Server 2014 dường như bỏ qua ước tính rất chính xác được cung cấp bởi các số liệu thống kê và thay vào đó sử dụng ước tính thấp hơn nhiều. Điều này tạo ra một kế hoạch chậm hơn nhiều, không dự trữ gần đủ bộ nhớ và tràn sang tempdb.

Tôi đã thử cờ theo dõi 4199, nhưng điều đó không khắc phục được tình hình. Cuối cùng, tôi đã cố gắng đào sâu vào thông tin tối ưu hóa thông qua sự kết hợp của các cờ theo dõi (3604, 8606, 8607, 8608, 8612), như đã trình bày trong nửa sau của bài viết này . Tuy nhiên, tôi không thể thấy bất kỳ thông tin nào giải thích ước tính xấu cho đến khi nó xuất hiện trong cây đầu ra cuối cùng.

Vấn đề kết nối

Dựa trên các câu trả lời cho câu hỏi này, tôi cũng đã gửi vấn đề này như là một vấn đề trong Kết nối

Câu trả lời:


14

Cách ước tính cardinality có nguồn gốc chắc chắn có vẻ phản trực giác đối với tôi. Tính toán đếm riêng biệt (có thể xem được với Sự kiện mở rộng hoặc cờ theo dõi 2363 và 3604) là:

Thống kê phái sinh

Chú ý nắp. Logic chung của điều này có vẻ rất hợp lý (không thể có các giá trị khác biệt hơn), nhưng giới hạn được áp dụng từ các thống kê đa cột được lấy mẫu :

DBCC SHOW_STATISTICS 
    (BigFactTable, [PK_BigFactTable])
WITH
    STAT_HEADER, 
    DENSITY_VECTOR;

Chỉ số PK

Điều đó cho thấy 2.980.235 hàng được lấy mẫu trong số 3,439,431,721 với vectơ mật độ ở mức Col5 là 3.35544E-07. Đối ứng của điều đó cho một số giá trị riêng biệt là 2.980.235 được làm tròn bằng toán học thực tế đến 2.980.240.

Bây giờ câu hỏi là, được đưa ra thống kê được lấy mẫu, mô hình nào sẽ đưa ra giả thuyết về số lượng giá trị riêng biệt. Tôi hy vọng nó sẽ ngoại suy, nhưng điều đó không được thực hiện, và có lẽ là cố tình.

Trực giác hơn, tôi mong đợi rằng thay vì sử dụng số liệu thống kê nhiều cột, nó sẽ xem xét mật độ trên Col5 (nhưng không phải vậy):

DBCC SHOW_STATISTICS 
    (BigFactTable, [_WA_Sys_00000005_24927208])
WITH
    STAT_HEADER, 
    DENSITY_VECTOR;

Chỉ số Col5

Ở đây mật độ là 9.266754E-10, đối ứng của nó là 1.079.126.528 .

Một cách giải quyết rõ ràng trong lúc này là cập nhật số liệu thống kê nhiều cột với quét toàn bộ. Khác là sử dụng công cụ ước tính cardinality ban đầu.

Mục Connect bạn mở ra, SQL 2014 được lấy mẫu thống kê nhiều cột ghi đè thống kê đơn cột chính xác hơn cho cột không hàng đầu , được đánh dấu cố định cho SQL Server 2017.

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.