sql-server – SQL Server怎样确定缺失索引哀求中的键列次序?
SQL Server怎样确定查询打算穷乏索引提议中的键列次序? 办理要领当SQL Server为特定查询打算建设穷乏索引提议时,它会将也许的键列分为2组.第一组包括属于EQUALITY谓词的全部保举列.第二组包括属于INEQUALITY谓词的全部保举列.在每个荟萃中,列按照表界说按列的序号位置排序. (很是感激Brent Ozar构建针对Stack Overflow数据库的repro脚原来证明这一点!) 1.建设3个沟通的表,但按差异次序安分列. (这里的缘故起因是行使各类列名和数据范例来表白这不会影响缺失索引提议中的列次序.) CREATE TABLE dbo.NumberLetterDate (ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,fINT INT,fNVARCHAR NVARCHAR(40),fDATE DATETIME,AboutMe NVARCHAR(MAX)); GO CREATE TABLE dbo.LetterDateNumber (ID INT IDENTITY(1,AboutMe NVARCHAR(MAX)); GO CREATE TABLE dbo.DateNumberLetter (ID INT IDENTITY(1,AboutMe NVARCHAR(MAX)); GO 2.行使沟通的数据添补表.行使现实数据漫衍从Users表中获取100,000行. INSERT INTO dbo.NumberLetterDate(fINT,fNVARCHAR,fDATE,AboutMe) SELECT TOP 100000 Age,DisplayName,LastAccessDate,AboutMe FROM dbo.Users WITH (NOLOCK) ORDER BY Id; GO INSERT INTO dbo.LetterDateNumber(fINT,AboutMe FROM dbo.Users WITH (NOLOCK) ORDER BY Id; GO INSERT INTO dbo.DateNumberLetter(fINT,AboutMe FROM dbo.Users WITH (NOLOCK) ORDER BY Id; GO 3.编写必要索引的查询.从3个相称过滤器开始,过滤全部3个字段中的准确值.请留意,全部3个查询都以沟通的次序具有沟通的字段: SELECT ID FROM dbo.NumberLetterDate WHERE fINT = 100 AND fNVARCHAR = 'Brent Ozar' AND fDATE = '2018/01/01' AND 1 = (SELECT 1); SELECT ID FROM dbo.LetterDateNumber WHERE fINT = 100 AND fNVARCHAR = 'Brent Ozar' AND fDATE = '2018/01/01' AND 1 = (SELECT 1); SELECT ID FROM dbo.DateNumberLetter WHERE fINT = 100 AND fNVARCHAR = 'Brent Ozar' AND fDATE = '2018/01/01' AND 1 = (SELECT 1); GO 全部三个表都具有完全沟通的数据,而且查询完全沟通.独一的区别是字段次序 – 这也是我们穷乏索引哀求的差别: 在执行打算中,缺失索引哀求中的列次序与表中的列次序完全匹配.譬喻,在dbo.NumberLetterDate中,数字列是第一个,因此它也是穷乏索引哀求中的第一个: >在dbo.NumberLetterDate上,缺傲幽索引在fINT(数字),fLetter(nvarchar),fDate上,与表中字段的次序沟通 对付像这样的单表操纵,索引字段次序好像不依靠于查询中的选择性,数据范例或位置. (我把它留给其他人用更伟大的查询和毗连来证明这一点.) 4.殽杂不等式滤波器.譬喻,在INT字段中输入<> 100作为过滤器: SELECT ID FROM dbo.NumberLetterDate WHERE fINT <> 100 AND fNVARCHAR = 'Brent Ozar' AND fDATE = '2018/01/01' AND 1 = (SELECT 1); SELECT ID FROM dbo.LetterDateNumber WHERE fINT <> 100 AND fNVARCHAR = 'Brent Ozar' AND fDATE = '2018/01/01' AND 1 = (SELECT 1); SELECT ID FROM dbo.DateNumberLetter WHERE fINT <> 100 AND fNVARCHAR = 'Brent Ozar' AND fDATE = '2018/01/01' AND 1 = (SELECT 1); GO 在执行打算中,起首是相称字段,然后是不等式字段 – 以是在这里,fINT在全部3个缺失索引哀求中表现最后,由于它是不等式搜刮: 5.行使3个不等式过滤器.对全部字段行使沟通的搜刮(<>): SELECT ID FROM dbo.NumberLetterDate WHERE fINT <> 100 AND fNVARCHAR <> 'Brent Ozar' AND fDATE <> '2018/01/01' AND 1 = (SELECT 1); SELECT ID FROM dbo.LetterDateNumber WHERE fINT <> 100 AND fNVARCHAR <> 'Brent Ozar' AND fDATE <> '2018/01/01' AND 1 = (SELECT 1); SELECT ID FROM dbo.DateNumberLetter WHERE fINT <> 100 AND fNVARCHAR <> 'Brent Ozar' AND fDATE <> '2018/01/01' AND 1 = (SELECT 1); GO 因为没有相称的搜刮,全部3个字段在缺失索引提议中具有沟通的优先级次序,此刻我们回到纯粹按字段次序排序: (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |