代码之家  ›  专栏  ›  技术社区  ›  Sauron J.Vassallo

正确索引UNPIVOT sql查询

  •  0
  • Sauron J.Vassallo  · 技术社区  · 5 年前

    如果我有这样一张桌子:

    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 回复  |  直到 5 年前
        1
  •  2
  •   Esat Erkec    5 年前

    我将1000.000测试数据填充到 学生 然后我开始测试表中的以下查询;

    注意 不要使用 DBCC DROPCLEANBUFFERS 在生产环境中的位置。

    测试环境:

    Microsoft SQL Server 2019(RC1)-15.0.1900.25(X64)2019年8月16日 (64位)在Windows 10 Pro 10.0上(内部版本17763:)

    测试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公司
    选择学生姓名、课程、分数
    交叉应用(
    价值观
    (“数学”,数学),
    (“英语”,英语),
    (“科学”,科学)
    )x(课程,分数)
    分数不为空
    
    

    测试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列有助于提高查询性能,特别是在这种情况下。

        2
  •  0
  •   GMB    5 年前

    我不确定哪些索引可用于优化查询。我们需要查看查询的执行计划,才能提出一个有教育意义的建议。

    CROSS APPLY VALUES 而不是 UNPIVOT . 这个 following blog article 详细介绍了它可以提供的性能改进。

    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
    

    我很想知道你是否得到了博客作者报道的同样的性能优势。