Tôi có một bảng với một cột chuỗi và một vị từ kiểm tra các hàng có độ dài nhất định. Trong SQL Server 2014, tôi thấy ước tính 1 hàng bất kể độ dài tôi đang kiểm tra. Điều này mang lại các kế hoạch rất kém vì thực sự có hàng ngàn hoặc thậm chí hàng triệu hàng và SQL Server đang chọn đặt bảng này ở phía bên ngoài của một vòng lặp lồng nhau.
Có lời giải thích nào cho ước tính cardinality là 1.0003 cho SQL Server 2014 trong khi SQL Server 2012 ước tính 31.622 hàng không? Có một cách giải quyết tốt?
Đây là một bản sao ngắn của vấn đề:
-- Create a table with 1MM rows of dummy data
CREATE TABLE #customers (cust_nbr VARCHAR(10) NOT NULL)
GO
INSERT INTO #customers WITH (TABLOCK) (cust_nbr)
SELECT TOP 1000000
CONVERT(VARCHAR(10),
ROW_NUMBER() OVER (ORDER BY (SELECT NULL))) AS cust_nbr
FROM master..spt_values v1
CROSS JOIN master..spt_values v2
GO
-- Looking for string of a certain length.
-- While both CEs yield fairly poor estimates, the 2012 CE is much
-- more conservative (higher estimate) and therefore much more likely
-- to yield an okay plan rather than a drastically understimated loop join.
-- 2012: 31,622 rows estimated, 900K rows actual
-- 2014: 1 row estimated, 900K rows actual
SELECT COUNT(*)
FROM #customers
WHERE LEN(cust_nbr) = 6
OPTION (QUERYTRACEON 9481) -- Optionally, use 2012 CE
GO
Đây là một kịch bản đầy đủ hơn cho thấy các bài kiểm tra bổ sung
Tôi cũng đã đọc whitepaper trên Công cụ ước tính Cardinality của SQL Server 2014 , nhưng không tìm thấy bất cứ điều gì làm rõ tình hình.