1

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

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

我想做的最后一件事是让性能进一步下降,录制配置文件听起来像是性能杀手。

4

2 回答 2

1

您至少有以下选择。

  • 查看SQL Analyzer中执行不良查询的计划并尝试对其进行优化,从那里逐个查询。
  • 或使用脚本(见下文)通过分析 SQLServer 关于您可以创建哪些索引的统计数据来为您提供建议。
  • 或使用数据库引擎优化顾问为您建议和/或创建索引以加快查询速度
  • 或者使用像redgate 的 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
于 2009-06-05T12:16:49.577 回答
1

您应该能够通过 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;

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

于 2009-06-05T12:28:42.530 回答