首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确索引UNPIVOT SQL查询

正确索引UNPIVOT SQL查询
EN

Stack Overflow用户
提问于 2019-11-03 01:36:48
回答 2查看 562关注 0票数 3

如果我有一张桌子,比如:

代码语言:javascript
复制
CREATE TABLE Students
(
    Id INT PRIMARY KEY IDENTITY,
    StudentName VARCHAR (50),
    Math INT,
    English INT,
    History INT,
    Science INT
)
GO

以及unpivot查询,如:

代码语言:javascript
复制
SELECT StudentName, Course, Score
FROM Students
UNPIVOT
(
    Score
    FOR Course in (Math, English, History, Science)
) AS SchoolUnpivot

最优指数是什么样子的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-03 21:05:18

我在学生表中填充了1.000.000个测试数据,然后开始测试以下查询;

Note不使用生产环境中的DBCC DROPCLEANBUFFERS状态。

测试环境:

Microsoft 2019 (RC1) - 15.0.1900.25 (X64) 2019年8月16日14:20:53版权(C) 2019微软公司开发版(64位)在Windows10Pro10.0 (Build 17763:)

测试-1:

下面的查询需要34秒

代码语言:javascript
复制
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秒

代码语言:javascript
复制
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秒,执行计划也在执行计划中使用创建的索引。

代码语言:javascript
复制
   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)

作为一个结果,使用非聚集索引中的un透视列可以帮助我们提高查询性能,特别是在这种情况下。

票数 2
EN

Stack Overflow用户

发布于 2019-11-03 01:52:00

我不确定可以使用哪些索引来优化查询。您需要查看查询的执行计划,才能提出有意义的建议。

但是在进行索引之前,您可以尝试优化查询。提高性能的一个选择是使用CROSS APPLY VALUES而不是UNPIVOT以下博客文章非常详细地介绍了它可以提供的性能改进。

因此,请考虑以下查询:

代码语言:javascript
复制
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

博客作者报告说,我很想知道你是否获得了同样的性能收益。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58676754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档