【问题标题】:Easy performance metrics for SQL Server 2000SQL Server 2000 的简单性能指标
【发布时间】:2009-06-05 11:18:13
【问题描述】:

我使用(和更新)的报告需要很长时间(有些需要几个小时)。我觉得这太长了,之前问过这个问题。在浏览了各种讨论 SQL 性能的网站后,他们都采取了 DBA 的立场。但是我不是,我的同事也不是(我想如果我们有 DBA 就不会遇到这个问题)。

我想要的是返回前 10 个运行最多和性能最差的脚本的简单方法。我希望有一个不错的 SET METRICS ON 开关,但我想如果是这样的话,网站就不会继续记录配置文件了。

我最不想做的事情是让性能进一步下降,录制个人资料听起来就像是性能杀手。

【问题讨论】:

  • 很遗憾不能升级到SQL Server 2008,它会告诉你这些事情。活动监视器将按几个条件向您显示最热门的查询,让您查看查询和执行计划。报告可按各种标准等针对热门查询、表和索引提供。

标签: performance sql-server-2000 metrics


【解决方案1】:

您至少有以下选择。

  • 查看SQL Analyzer 中执行不良查询的计划并尝试优化它,从那里逐个查询。
  • 或使用脚本(见下文)通过分析 SQLServer 关于您可以创建哪些索引的统计数据来为您提供建议
  • 或使用Database Engine Tuning Advisor 为您建议和/或创建索引以加快查询速度
  • 或使用redgate's SQL Response 之类的工具为您提供超出您消化能力的更多信息

最终,自动化工具会让您走得更远。在您的情况下甚至可能就足够了,但请记住,没有任何自动化工具能够胜过熟练的 DBA,因为自动化工具无法重写您的查询。


SET CONCAT_NULL_YIELDS_NULL OFF
--Joining the views gives a nice picture of what indexes 
--would help and how much they would help
SELECT 
  'CREATE INDEX IX_' + UPPER(REPLACE(REPLACE(COALESCE(equality_columns, inequality_columns), '[', ''), ']', ''))
    + ' ON ' + d.statement + '(' + COALESCE(equality_columns, inequality_columns) 
  + CASE WHEN equality_columns IS NOT NULL THEN  
        CASE WHEN inequality_columns IS NOT NULL THEN ', ' + inequality_columns 
        END END 
    + ')' + CASE WHEN included_columns IS NOT NULL THEN ' INCLUDE (' + included_columns + ')' END
  , object_name(object_id)
  , d.*
  , s.*
FROM    sys.dm_db_missing_index_details d 
      LEFT OUTER JOIN sys.dm_db_missing_index_groups g ON   d.index_handle = g.index_handle
      LEFT OUTER JOIN sys.dm_db_missing_index_group_stats s ON  g.index_group_handle = s.group_handle
WHERE   database_id = db_id()
ORDER BY avg_total_user_cost DESC

【讨论】:

  • 这给出了关于无效对象的 4 个错误。例如:“无效的对象名称'sys.dm_db_missing_index_details'。”
  • 和我的一样... dm_db_missing_index_groups 是 SQL2005 :( 我闻到了升级的机会 ;)
  • @graham.reeds:对不起,确实是SQL2005而已。
【解决方案2】:

您应该能够通过 sys.dm_exec_query_stats 表,该表保存了针对数据库的所有查询的信息。

SELECT  creation_time  
    ,last_execution_time 
    ,total_physical_reads
    ,total_logical_reads  
    ,total_logical_writes
    , execution_count 
    , total_worker_time
    , total_elapsed_time 
    , total_elapsed_time / execution_count avg_elapsed_time
    ,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
     ((CASE 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) st
ORDER BY last_execution_time,total_elapsed_time / execution_count DESC;

为您提供历史查询所用时间的基本时间信息。

【讨论】:

  • 这看起来类似于我在旅行中看到的另一个查询 - 给出了相同的错误“第 16 行:'APPLY'附近的语法不正确”
  • 是的,我的错... CROSS APPLY 是 SQL2005。我会看看我是否不能用 CROSS JOIN 重写它...
猜你喜欢
  • 2011-10-13
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 2010-12-17
  • 2015-05-13
  • 2010-09-15
相关资源
最近更新 更多