Может ли индекс улучшить производительность, когда все строки таблицы используются для агрегирования? - PullRequest
0 голосов
/ 18 сентября 2018

В прошлом месяце я пытался улучшить время выполнения хранимой процедуры SQL Server, используемой компанией, в которой я работаю, в попытке сократить время извлечения, созданного в таблице.

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

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

Но после нескольких часов попыток и тестированияпроизводительность, я не смог достичь своей цели.

Впервые мне нужно применить индексы к таблице, и даже если я много о них читал, я все еще нахожу некоторыеИз-за трудностей с пониманием сложности индексации таблицы, я не нашел аналогичного сценария.

Что я хочу знать, так это: можно ли применить какой-либо индекс к временной таблице с помощью запроса, которыйвыполняет группирование по всем столбцам, которые существуют в этой таблице.

Вот пример кода:

SELECT 
    A.College,
    A.Department,
    A.CourseNumber,
    A.Subject,
    A.CourseSimple,
    A.Section,
    A.AcademicYear,
    A.Term,
    A.TermBeginDate,
    A.Item,
    A.CourseItemGroup,
    A.FullDate,
    A.WeekLevel,
    B.Instructor,
    SUM(A.Minutes) 'Minutes',
    COUNT(Distinct A.UserKey) 'Students',
    SUM(A.Items) 'Items'
FROM 
    #TT2 A
INNER JOIN 
    #TT3 B ON A.RowNumber = B.RowNumber
GROUP BY 
    A.College,
    A.Department,
    A.CourseNumber,
    A.Subject,
    A.CourseSimple,
    A.Section,
    A.AcademicYear,
    A.Term,
    A.TermBeginDate,
    A.Item,
    A.CourseItemGroup,
    A.FullDate,
    A.WeekLevel,
    B.Instructor

Я бы хотел применить индекс к # TT2.

1 Ответ

0 голосов
/ 18 сентября 2018

Неважно, что, вы должны прочитать каждую строку данных, чтобы получить информацию, которую вы ищете.Единственный способ сделать это быстрее - это создать охватывающий индекс , который содержит все поля, которые вам нужно получить, в основном в операторе INCLUDE.Этот оператор создания будет выглядеть примерно так:

CREATE INDEX Idx_Covering ON #tt2 (RowNumber)
INCLUDE (
    College,
    Department,
    CourseNumber,
    Subject,
    CourseSimple,
    Section,
    AcademicYear,
    Term,
    TermBeginDate,
    Item,
    CourseItemGroup,
    FullDate,
    WeekLevel,
    Minutes,
    UserKey,
    Items
    )

В зависимости от текущей индексации, вы можете сделать индекс уникальным.Вы также можете попробовать CLUSTERED INDEX для Rownumber, но, по моему опыту, индекс покрытия обычно быстрее.

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