Sql-Server

如何判斷我的 SQL Server 數據庫性能是否受硬體限制?

  • June 12, 2011

測試目前處於單使用者負載下的應用程序 - 隨著測試數據增加到生產規模(每個表 400k-2M 行),一些 SELECT sp 不再足夠快(測試數據有限,過去每個小於 30ms,現在是 100-200 毫秒,但有幾個,所以延遲在 UI 中變得很明顯)。

您可以使用DBCC SQLPERF("waitstats"). 這將返回您的 SQL 伺服器正在等待的任務的等待時間。每個計數器的詳細說明可以在網上找到。您可以使用此資訊找出您的瓶頸。

此外,在查詢分析器中打開客戶端統計資訊以查看客戶端的等待時間。

我假設您的硬體自您的初始測試以來沒有改變,所以由於它們是恆定的,我不會懷疑它們。

想法:

  • 硬體幾乎從來都不是問題:它的設計和程式碼都很糟糕
  • 始終使用接近生產數據的質量和數量進行測試

一些解決方案:

執行缺失的索引 DMV 以查看缺失的索引:

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

…以及最昂貴的 DMV 查詢

SELECT TOP 20
   qs.sql_handle,
   qs.execution_count,
   qs.total_worker_time AS Total_CPU,
   total_CPU_inSeconds = --Converted from microseconds
   qs.total_worker_time/1000000,
   average_CPU_inSeconds = --Converted from microseconds
   (qs.total_worker_time/1000000) / qs.execution_count,
   qs.total_elapsed_time,
   total_elapsed_time_inSeconds = --Converted from microseconds
   qs.total_elapsed_time/1000000,
   st.text,
   qp.query_plan
FROM
   sys.dm_exec_query_stats AS qs
       CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
       CROSS apply sys.dm_exec_query_plan (qs.plan_handle) AS qp
ORDER BY qs.total_worker_time DESC

否則,這個 SO 問題對我和其他 SQL 高代表類型有很好的提示:https ://stackoverflow.com/q/4118156/27535 (我不會複製/粘貼所有 3 個冗長的答案)

引用自:https://dba.stackexchange.com/questions/3271