Як змусити sp_BlitzIndex Brent Ozar працювати на Azure?


13

Я завантажив комплект першої допомоги SQL Server із веб-сайту Brent Ozar. Коли я спробував запустити скрипт sp_BlitzIndex проти моєї основної бази даних через Microsoft Sql Server Studio Studio, під час входу в систему як адміністратор рівня сервера баз даних Azure, і я отримав таку помилку:

Повідомлення 262, Рівень 14, Стан 18, Процедура sp_BlitzIndex, Рядок 18 СТВОРЕННЯ ДОСЛІДЖЕННЯ ПРОЦЕДУРИ відмовлено в базі даних "master".

Я успішно створив процедуру на екземплярі бази даних, який хотів перевірити. Коли я виконав процедуру, я отримав помилку із зазначенням:

Повідомлення 50000, Рівень 16, стан 1, рядок 1265 Недійсне ім'я об'єкта "mydatabase.sys.partitions".

Далі я намагався бути розумним і запускати збережений код процедури безпосередньо проти основної бази даних, не створюючи збережену процедуру, і отримав таку помилку:

Msg 50000, рівень 15, стан 1, рядок 1267 Посилання на ім'я бази даних та / або сервера в "mydatabase.sys.indexes" не підтримується в цій версії SQL Server.

Я не відчуваю себе достатньо впевнено, щоб почати грати з внутрішньою роботою ~ 2700 рядків евристичної логіки індексу. Чи існує швидкий і простий спосіб змусити цю збережену процедуру добре працювати на базі даних Azure SQL або я повинен шукати в іншому місці інструмент аналізу індексу / збережена процедура?

Відповіді:


24

Кендра тут (автор sp_BlitzIndex)

По-перше, дякую, що зацікавились процедурою та спробували її.

Azure не виставляє всіх поглядів динамічного управління, які ми отримуємо в упаковці продукту. Насправді я посилаюся sys.dm_db_partition_stats, але є інша інформація, яку мені потрібно отримати sys.partitionsдля інших користувачів. (Чи використовується компресія? Який тип?)

Я не встиг написати тест для певної версії Azure, просто тому, що в мене не було великого попиту на нього. Але ваше запитання говорить про те, що у мене є більший інтерес, ніж я знав, - так це є!

Я, як мінімум, роздивлюся на реалізацію деяких помилок, але це дозволяє вам знати це витончено. (Це трохи рухається ціль, оскільки Azure розширює функції, доступні і для користувачів.)


1
Оскільки V12 виставляє багато інших DMV, чи вважаєте ви, що ви зможете зробити sp_BlitzIndexроботу над V12, або вона все ще не вистачає занадто багато відповідних бітів, щоб бути вартими? За умови, що у вас є вільний час / потреба, звичайно. :)
Ерік

@Kendra - Було б дійсно чудово, якби це можна було оновити для роботи на Azure !! Я помічаю, що остання версія 20160715 не помиляється під час запуску, sp_BlitzIndexале підозріло каже, що великих проблем не знайдено. Я підозрюю, що це тому, що потрібна інформація ще не доступна в Azure. Коли я біжу, @mode=4я отримую помилку.
Рорі

Я зараз працюю над іншими проектами, і пройшло вже так давно, як я працював над sp_BlitzIndex, що не знаю, чи зможу я навіть розпізнати код. Але гарна новина, це вже відкрите джерело! Інші люди теж можуть це зробити. Ви можете передати в на firstresponderkit.org
Кендрі

1

Деякі із "стандартних" запитів для виявлення відсутніх індексів виконуються на Azure, наприклад :

  SELECT
  migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) AS improvement_measure,
  'CREATE INDEX [missing_index_' + CONVERT (varchar, mig.index_group_handle) + '_' + CONVERT (varchar, mid.index_handle)
  + '_' + LEFT (PARSENAME(mid.statement, 1), 32) + ']'
  + ' ON ' + mid.statement
  + ' (' + ISNULL (mid.equality_columns,'')
    + CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN ',' ELSE '' END
    + ISNULL (mid.inequality_columns, '')
  + ')'
  + ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement,
  migs.*, mid.database_id, mid.[object_id]
FROM sys.dm_db_missing_index_groups mig
INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) > 10
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC

Вони, ймовірно, будуть набагато менш корисні, ніж sp_BlitzIndexварто, але варто спробувати.

Ось ще один зручний запит для визначення найпопулярніших запитів, який ви можете потім запустити разом із Планом виконання для виявлення відсутніх індексів через SQL Management Studio. Стомлюючи їх робити по черзі, але краще, ніж нічого:

SELECT TOP 1000 qs.execution_count, 
       qs.total_worker_time, 
       qs.total_worker_time / qs.execution_count AS 'Avg CPU Time', 
       qs. total_physical_reads, 
       qs.total_physical_reads / qs.execution_count AS 'Avg Physical Reads', 
       qs.total_logical_reads, 
       qs.total_logical_reads / qs.execution_count AS 'Avg Logical Reads', 
       qs.total_logical_writes, 
       qs.total_logical_writes / qs.execution_count AS 'Avg Logical Writes', 
       SUBSTRING(st.text, qs.statement_start_offset / 2 + 1, 
        (CASE qs.statement_end_offset
                     WHEN-1 THEN DATALENGTH(st.text)
                     ELSE qs.statement_end_offset
                     END
           - qs.statement_start_offset) / 2 + 1)AS statement_text
  FROM sys.dm_exec_query_stats AS qs 
  CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle)AS st
  ORDER BY qs.execution_count DESC;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.