如何使Brent Ozar的sp_BlitzIndex在Azure上运行?


13

我从Brent Ozar的网站下载了SQL Server急救包。当我尝试通过Microsoft Sql Server Management Studio对我的主数据库运行sp_BlitzIndex脚本时,以Azure数据库服务器级管理员身份登录时,出现以下错误:

消息262,级别14,状态18,过程sp_BlitzIndex,第18行在数据库'master'中拒绝了CREATE PROCEDURE权限。

我在要测试的数据库实例上成功创建了该过程。当我执行该过程时,出现错误提示:

消息50000,级别16,状态1,行1265无效的对象名称“ mydatabase.sys.partitions”。

接下来,我尝试变得聪明,直接对master数据库运行存储过程代码,而不创建存储过程,并收到以下错误:

消息50000,级别15,状态1,行1267在此版本的SQL Server中,不支持在“ mydatabase.sys.indexes”中引用数据库和/或服务器名称。

我没有足够的信心开始玩弄大约2700行索引启发式逻辑的内部工作。是否有一种快速简便的方法来使该存储过程在Azure SQL数据库上正常工作,还是应该在其他地方寻找索引分析工具/存储过程?

Answers:


24

Kendra here(的作者sp_BlitzIndex

首先,感谢您对该过程感兴趣并进行了尝试。

Azure并未公开我们在盒装产品中获得的所有动态管理视图。我确实在参考sys.dm_db_partition_stats,但是我还需要sys.partitions其他用户的其他信息。(使用压缩吗?是什么类型的?)

我没有时间编写针对Azure特定版本的测试,只是因为我对此没有太多需求。但是您的问题确实告诉我,我的兴趣比我知道的还要多-就是这样!

我至少会看一下实现一些错误处理的方法,尽管如此,它还是可以让您以一种优美的方式知道。(这是一个不断变化的目标,因为Azure一直在扩展用户也可以使用的功能。)


1
由于V12 公开了更多的DMV,您认为您可以sp_BlitzIndex在V12 上进行工作,还是它仍然缺少太多相关位而不值得?只要您有空闲时间/需求。:)
Erik 2015年

@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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.