Sql-Server
如何判斷我的 SQL Server 數據庫性能是否受硬體限制?
測試目前處於單使用者負載下的應用程序 - 隨著測試數據增加到生產規模(每個表 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 個冗長的答案)