如果我有一个表格,例如:
CREATE TABLE Students
(
Id INT PRIMARY KEY IDENTITY,
StudentName VARCHAR (50),
Math INT,
English INT,
History INT,
Science INT
)
GO
和一个unpivot
查询,例如:
SELECT StudentName, Course, Score
FROM Students
UNPIVOT
(
Score
FOR Course in (Math, English, History, Science)
) AS SchoolUnpivot
最佳索引是什么样的?
我将1.000.000测试数据填充到“学生”表中,然后开始测试以下查询;
注意请勿DBCC DROPCLEANBUFFERS
在生产环境中使用该语句。
测试环境 :
Microsoft SQL Server 2019(RC1)-15.0.1900.25(X64)2019年8月16日14:20:53版权所有(C)2019 Windows 10 Pro 10.0(内部版本17763:)的Microsoft Corporation Developer Edition(64位)
测试1:
以下查询需要34秒。
DBCC DROPCLEANBUFFERS
GO
SELECT StudentName, Course, Score
FROM Students
CROSS APPLY (
VALUES
('Math', Math),
('English', English),
('History', History),
('Science', Science)
) x(Course, Score)
WHERE Score IS NOT NULL
OPTION (MAXDOP 1)
测试2:
以下查询需要40秒。
DBCC DROPCLEANBUFFERS
GO
SELECT StudentName, Course, Score
FROM Students
CROSS APPLY (
VALUES
('Math', Math),
('English', English),
('History', History),
('Science', Science)
) x(Course, Score)
WHERE Score IS NOT NULL
OPTION (MAXDOP 1)
测试3:
以下查询在创建索引后需要32秒,执行计划也会在执行计划中使用创建的索引。
CREATE NONCLUSTERED INDEX [PerformanceIndex] ON [dbo].[Students]
(
[Id] ASC,
[Math] ASC,
[English] ASC,
[History] ASC,
[Science] ASC
)
INCLUDE([StudentName])
GO
DBCC DROPCLEANBUFFERS
GO
SELECT StudentName, Course, Score
FROM Students
UNPIVOT
(
Score
FOR Course in (Math, English, History, Science)
) AS SchoolUnpivo
OPTION (MAXDOP 1)
结果,在非聚集索引中使用unpivot列有助于我们提高查询性能,尤其是在这种情况下。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句