Надлежащим образом индексировать запрос UNPIVOT SQL - PullRequest
2 голосов
/ 03 ноября 2019

Если бы у меня была таблица, такая как:

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

Как бы выглядел оптимальный индекс?

Ответы [ 2 ]

2 голосов
/ 04 ноября 2019

Я заполнил 1.000.000 тестовых данных в таблицу Студенты , а затем начал тестировать следующие запросы:

Примечание Не использовать DBCC DROPCLEANBUFFERSоценка в производственной среде.

Тестовая среда:

Microsoft SQL Server 2019 (RC1) - 15.0.1900.25 (X64) 16 августа 2019 14:20: 53 Copyright (C) 2019 Microsoft Corporation Developer Edition (64-разрядная версия) в Windows 10 Pro 10.0 (сборка 17763:)

Test-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)

Test-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)

Test-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)

В результате использование столбцов разворачивания в некластеризованном индексе помогает нам повысить производительность запросов, в частностидля этого случая.

0 голосов
/ 03 ноября 2019

Я не уверен, какие индексы могут быть использованы для оптимизации запроса. Чтобы получить обоснованное предложение, нужно взглянуть на план выполнения запроса.

Но прежде чем приступить к индексации, вы можете попытаться оптимизировать запрос. Один из вариантов повышения производительности - использовать CROSS APPLY VALUES вместо UNPIVOT. В следующей статье блога подробно рассказывается об улучшении производительности, которое она может обеспечить.

Следовательно, рассмотрим следующий запрос:

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

Мне интересно узнать,автор блога сообщил о том же выигрыше в производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...