Bir dize sütunu olan bir tablo ve belirli bir uzunlukta satırları denetleyen bir yüklemem var. SQL Server 2014'te, kontrol ettiğim uzunluktan bağımsız olarak 1 satırlık bir tahmin görüyorum. Bu çok kötü planlar veriyor çünkü aslında binlerce hatta milyonlarca satır var ve SQL Server bu tabloyu iç içe bir döngünün dış tarafına koymayı seçiyor.
SQL Server 2012 31.622 satır tahmin ederken SQL Server 2014 için 1.0003 kardinalite tahmini için bir açıklama var mı? İyi bir geçici çözüm var mı?
İşte konunun kısa bir tekrarı:
-- 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
İşte ek testler gösteren daha eksiksiz bir script
Ayrıca , SQL Server 2014 Kardinalite Tahmincisi'nin tanıtım belgesini de okudum , ancak durumu netleştiren bir şey bulamadım.