正确索引UNPIVOT SQL查询

索伦

如果我有一个表格,例如:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章