2009-06-05 64 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