SUBSTRING () veya diğer dize işlevlerini içeren tahminler için SQL Server 2016'da kardinalitenin nasıl tahmin edildiğine dair değişiklikler hakkında herhangi bir belge veya araştırma var mı?
Sormamın nedeni, performansı uyumluluk modunda 130 bozulan bir sorguya bakmam ve nedeni SUBSTRING () çağrısını içeren bir WHERE yan tümcesi ile eşleşen satırların sayısındaki değişiklikle ilgili olmasıdır. Sorgu yeniden yazma ile ilgili sorunu düzelttim, ancak SQL Server 2016'da bu alandaki değişikliklerle ilgili herhangi bir belgenin farkında olup olmadığını merak ediyorum.
Demo kodu aşağıdadır. Bu test durumunda tahminler çok yakındır, ancak doğruluk verilere bağlı olarak değişir.
Test durumunda, uyumluluk seviyesi 120'de, SQL Server tahmin için histogram kullanıyor gibi görünürken, uyumluluk seviyesi 130'da SQL Server, tablo eşleşmelerinin sabit% 10'unu varsayıyor gibi görünmektedir.
CREATE DATABASE MyStringTestDB;
GO
USE MyStringTestDB;
GO
DROP TABLE IF EXISTS dbo.StringTest;
CREATE TABLE dbo.StringTest ( [TheString] varchar(15) );
GO
INSERT INTO dbo.StringTest
VALUES
( 'Y5_CLV' );
INSERT INTO dbo.StringTest
VALUES
( 'Y5_EG3' );
INSERT INTO dbo.StringTest
VALUES
( 'ZY_NE' );
INSERT INTO dbo.StringTest
VALUES
( 'ZY_PQT' );
INSERT INTO dbo.StringTest
VALUES
( 'ZY_T2V' );
INSERT INTO dbo.StringTest
VALUES
( 'ZY_TT4' );
INSERT INTO dbo.StringTest
VALUES
( 'ZY_ZKK' );
INSERT INTO dbo.StringTest
VALUES
( 'ZZ_LW6' );
INSERT INTO dbo.StringTest
VALUES
( 'ZZ_QO3' );
INSERT INTO dbo.StringTest
VALUES
( 'ZZ_TZ7' );
INSERT INTO dbo.StringTest
VALUES
( 'ZZ_UZZ' );
CREATE CLUSTERED INDEX IX_Clustered ON dbo.StringTest (TheString);
/*
Uses fixed % for estimate; 1.1 rows estimated in this case.
Plan for computation:
CSelCalcFixedFilter (0.1) <----
Selectivity: 0.1
*/
ALTER DATABASE MyStringTestDB SET compatibility_level = 130;
GO
SELECT *
FROM dbo.StringTest
WHERE SUBSTRING(TheString, 1, CHARINDEX('_',TheString) - 1) = 'ZZ'
OPTION (QUERYTRACEON 2363, QUERYTRACEON 3604);
/*
Uses histogram to get estimate of 1
CSelCalcPointPredsFreqBased <----
Distinct value calculation:
CDVCPlanLeaf
0 Multi-Column Stats, 1 Single-Column Stats, 0 Guesses
Individual selectivity calculations:
(none)
Loaded histogram for column QCOL: [DBA].[dbo].[StringTest].TheString from stats with id 1
*/
ALTER DATABASE MyStringTestDB SET compatibility_level = 120;
GO
SELECT *
FROM dbo.StringTest
WHERE SUBSTRING(TheString, 1, CHARINDEX('_',TheString) - 1) = 'ZZ'
OPTION (QUERYTRACEON 2363, QUERYTRACEON 3604);
/*
-- Simpler rewrite; works fine in both compat levels and gets better estimate.
SELECT *
FROM dbo.StringTest
WHERE TheString LIKE 'ZZ[_]%'
OPTION (QUERYTRACEON 2363, QUERYTRACEON 3604);
*/
Y5_EG3
dizeler sadece kodlar ve her zaman büyük harfse, her zaman bir ikili harmanlama belirtmeyi deneyebilirsiniz -Latin1_General_100_BIN2
- filtreleme işlemlerinde hızı geliştirmelidir. Sadece eklemekCOLLATE Latin1_General_100_BIN2
içinCREATE TABLE
hemen sonra açıklamadavarchar(15)
. Plan üretimini / tahminini de etkileyip etkilemediğini merak ediyorum.