2009-06-05 95 views
1

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

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

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

+0

很遗憾,你不能升级到SQL Server 2008,它会告诉你这些事情。活动监视器将通过几个标准向您显示顶级查询,允许您查看查询和执行计划。根据各种标准报告可用于顶级查询,表格和索引等。 – 2009-06-05 12:21:53

回答

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 
+0

这给出了有关无效对象的4个错误。例如:“无效的对象名'sys.dm_db_missing_index_details'”。 – 2009-06-05 12:39:16

+0

同我的一样... dm_db_missing_index_groups是SQL2005 :( 我闻到升级机会;) – 2009-06-05 13:03:54

+0

@ graham.reeds:对不起,它的确只是SQL2005。 – 2009-06-05 13:18:19

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; 

为您提供了历史上查询花了多长时间的基本计时信息。

+0

这看起来类似于我在我的旅行中看到的另一个查询 - 给出了“行16:错误语法附近'应用'” – 2009-06-05 12:38:04

+0

是的,我的坏... CROSS APPLY是SQL2005的错误。我会看看我是否不能用CROSS JOIN重写它... – 2009-06-05 12:54:56