Как мне запустить sp_BlitzIndex Брента Озара для работы на Azure?

13

Я скачал аптечку SQL Server с веб-сайта Брента Озара. Когда я попытался запустить сценарий sp_BlitzIndex для своей основной базы данных через Microsoft Sql Server Management Studio, когда вошел в систему как администратор уровня базы данных Azure, я получил следующую ошибку:

Сообщение 262, Уровень 14, Состояние 18, Процедура sp_BlitzIndex, Строка 18 Отказано в разрешении CREATE PROCEDURE в базе данных «master».

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

Сообщение 50000, уровень 16, состояние 1, строка 1265 Неверное имя объекта «mydatabase.sys.partitions».

Затем я попытался быть умным и запустить код хранимой процедуры непосредственно в базе данных master, не создавая хранимую процедуру, и получил следующую ошибку:

Сообщение 50000, уровень 15, состояние 1, строка 1267 Ссылка на имя базы данных и / или сервера в mydatabase.sys.indexes не поддерживается в этой версии SQL Server.

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

Erik
источник

Ответы:

24

Кендра здесь (автор sp_BlitzIndex)

Во-первых, спасибо, что проявили интерес к процедуре и опробовали ее.

Azure не раскрывает все динамические административные представления, которые мы получаем в коробочном продукте. Я действительно ссылаюсь sys.dm_db_partition_stats, но есть другая информация, которую я должен получить sys.partitionsдля других пользователей. (Используется ли сжатие? Какой тип?)

У меня не было времени написать тест для конкретной версии Azure, просто потому, что у меня не было большого спроса на нее. Но твой вопрос говорит мне, что есть больше интереса, чем я знал - так что это!

Я, как минимум, расскажу о том, как реализовать некоторую обработку ошибок, чтобы она дала вам возможность изящно узнать об этом. (Это немного движущаяся цель, потому что Azure расширяет возможности, которые также доступны пользователям.)

Кендра
источник
1
Поскольку V12 предоставляет еще больше DMV, как вы думаете, сможете ли вы sp_BlitzIndexработать над V12, или в нем по-прежнему отсутствует слишком много значимых битов, которые стоит того? Если у вас есть свободное время / спрос, конечно. :)
Эрик
@ Кендра - Было бы здорово, если бы это можно было обновить для работы на Azure !! Я замечаю, что последняя версия 20160715 не выдает ошибку при запуске, sp_BlitzIndexно подозрительно говорит, что никаких серьезных проблем не обнаружено. Я подозреваю, что это связано с тем, что необходимая информация еще не доступна в Azure. Когда я бегу с, @mode=4я получаю ошибку.
Рори
Я сейчас работаю над другими проектами, и я так долго работал над sp_BlitzIndex, что даже не знаю, смогу ли я вообще распознать код. Но хорошие новости, теперь это открытый код! Другие люди тоже могут это сделать. Вы можете принять участие
Кендра
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;
Рори
источник