Đố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
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