我正在调查 SQL 2005 服务器上存储过程的性能问题。这就是我打算这样做的方式:
- 分析任何不良 TSQL 实践的存储过程(如 count * 等)
- 通过 DTA 运行它
- 研究存储过程的估计查询计划
通过在数据库中运行此代码来查找缓存的计划:
SELECT deqp.dbid , deqp.objectid , deqp.encrypted , deqp.query_plan FROM sys.dm_exec_query_stats deqs CROSS APPLY sys.dm_exec_query_plan(deqs.plan_handle) AS deqp WHERE objectid = OBJECT_ID('procedurename', 'p') ;
- 查找相关索引(不确定如何)并检查使用情况
- 尝试找到任何缺失的索引
我还应该怎么做?非常感谢评论。
提前致谢
只要正确索引 where 子句,像 select count(*) 这样的事情就没问题。
DTA 可能有用也可能没用。
实际和估计的计划是你需要看的。它会告诉您是否缺少任何索引。使用的索引将在执行计划中。
首先要做的事情:如果你正在调查存储过程的性能问题,你必须有一个过程调用的基线,以及一个超过你期望性能的调用列表(还有一些你需要的统计数据:每天有多少次调用,如何许多都可以,而有多少很慢……等等)。
使用跟踪可以最轻松地完成此操作。因此,在开始调查之前,我建议您对那个特定的过程调用进行跟踪,不仅如此,还要对系统的完整负载进行描述,因为当有一个批处理作业时,让一个过程变得疯狂是很自然的杀死系统。
如果您还不了解所有这些信息,请阅读以下与 Profiler 和服务器跟踪相关的问题:
之后,您应该开始投入时间进行调整、阅读执行计划(也可以保存在跟踪中)并尝试重写您的代码。