Saya memiliki tabel dengan kolom string dan predikat yang memeriksa baris dengan panjang tertentu. Di SQL Server 2014, saya melihat perkiraan 1 baris terlepas dari panjang yang saya periksa. Ini menghasilkan rencana yang sangat buruk karena sebenarnya ada ribuan atau bahkan jutaan baris dan SQL Server memilih untuk meletakkan tabel ini di sisi luar dari loop bersarang.
Apakah ada penjelasan untuk perkiraan kardinalitas 1.0003 untuk SQL Server 2014 sementara SQL Server 2012 memperkirakan 31.622 baris? Apakah ada solusi yang baik?
Ini adalah reproduksi singkat dari masalah ini:
-- 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
Berikut ini adalah skrip yang lebih lengkap yang menunjukkan tes tambahan
Saya juga telah membaca whitepaper pada SQL Server 2014 Cardinality Estimator , tetapi tidak menemukan apa pun di sana yang menjelaskan situasi.
sumber