在当前处于单用户负载下测试应用程序-随着测试数据增加到生产规模(每张表400k-2M行),某些SELECT sp的速度不再足够快(测试数据有限,以前每个数据小于30ms,现在是100-200ms,但是有几个,因此延迟在UI中变得很明显)。
在当前处于单用户负载下测试应用程序-随着测试数据增加到生产规模(每张表400k-2M行),某些SELECT sp的速度不再足够快(测试数据有限,以前每个数据小于30ms,现在是100-200ms,但是有几个,因此延迟在UI中变得很明显)。
Answers:
您可以使用DBCC SQLPERF("waitstats")
。这将返回您的SQL Server正在等待哪些任务的等待时间。可以在网上找到每个计数器的详细说明。您可以使用此信息来找出瓶颈。
另外,在查询分析器中打开客户端统计信息,以查看客户端的等待时间。
我假设您的硬件自初始测试以来就没有改变,因此,由于它们是不变的,所以我不会怀疑它们。
想法:
一些解决方案:
运行缺少的索引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个冗长的答案)
应该考虑的有趣的事情是运行的MSSQL 2000版本
二进制文件有四个版本
这些版本中的每一个都有关于RAM和CPU的限制。
值得探讨的可能性是,由于查询需要更多的RAM来满足查询/子查询的需求或CPU利用率不足,当前存储的数据量已根本超过了MSSQL 2000版本的功能。您可能需要将二进制版本升级到MSSQL 2000 Entrprise版本(可能是因为您的MSSQL版本多旧而导致的远景)或预算可以承受的最佳版本。
您甚至可能想摆脱MSSQL 2000,因为2008是最新的并且具有当前支持。同样,这可能是预算问题。如果您已经在使用Enterprise,或者您的预算不允许进行任何重大升级,那么现在您可以浏览数据库统计信息或数据库设计。
免责声明:我不是SQL Server DBA