Непонятные советы по производительности от SQL Server Management Studio - PullRequest
2 голосов
/ 23 апреля 2019

Я работаю над улучшением производительности SQL. И SQL Server Management Studio дал мне удивительный совет. Ради примера я собираюсь упростить структуру таблиц и рекомендации, которые дали SSMS.

Структура таблицы Персона :

  • ID
  • first_name
  • last_name
  • date_of_birth
  • Адрес электронной почты

У меня был конкретный запрос, для которого я показал план выполнения. Потом я увидел совет, который дал SSMS, и это меня немного удивило. Рекомендуется добавить два индекса со следующей сигнатурой, которые должны повысить производительность на 41% и 53% соответственно:

CREATE NONCLUSTERED INDEX [person_1]
  ON [Person]([first_name],[last_name])
  INCLUDE ([id],[date_of_birth],[email])

CREATE NONCLUSTERED INDEX [person_2]
  ON [Person]([first_name],[last_name])
  INCLUDE ([id],[email])

Эти два индекса находятся в одинаковых столбцах. Только столбцы INCLUDE отличаются. Насколько я понимаю из чтения об индексах, первый индекс также включает в себя данные для второго индекса. Так почему же SSMS рекомендует второй индекс, а первый уже содержит необходимые данные?

1 Ответ

0 голосов
/ 23 апреля 2019

Никогда не используйте предложение SSMS как должное.Предложение основано на конкретном запросе.

Скорее изучите системные представления, такие как sys.dm_db_missing_index_details.См. Больше в sys.dm_db_missing_index_details

или ознакомьтесь с DMV-запросами Гленна Берри в Запросах диагностической информации SQL Server за апрель 2019 года

... или даже лучшевозьмите Brent Ozar sp_blitzindex BrentOzarULTD / SQL-Server-First-Responder-Kit

… или возьмите этот запрос

SELECT DB_NAME(database_id) AS database_name, 
       OBJECT_NAME(object_id, database_id) AS table_name, 
       mid.equality_columns, 
       mid.inequality_columns, 
       mid.included_columns, 
       (migs.user_seeks + migs.user_scans) * migs.avg_user_impact AS Impact, 
       migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) AS Score, 
       migs.user_seeks, 
       migs.user_scans
FROM sys.dm_db_missing_index_details mid
     INNER JOIN sys.dm_db_missing_index_groups mig ON mid.index_handle = mig.index_handle
     INNER JOIN sys.dm_db_missing_index_group_stats migs ON mig.index_group_handle = migs.group_handle
ORDER BY migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...