我听说过 SQL Server 默认保留的统计信息。他们在跟踪什么,我如何使用这些信息来改进我的数据库?
我有一个最近变得不可预测的 SQL Server 2005,我正在摸索为什么。在几秒钟内执行的查询正在更改计划并花费几分钟(在全表扫描或索引假脱机中花费时间)。现在第一个也是最明显的事情是,统计数据已经过时导致优化器感到困惑,但我相信事实并非如此 - 首先是因为基础数据没有显着变化(例如,在一年的数据之上添加一天的数据已经在表中),其次是因为自动创建统计和自动更新统计都是真的。然而,优化器越来越困惑;在 Tuning Advisor 中运行 SQL 给了我很多CREATE STATISTICS
似乎可以修复它的多列语句(直到 SQL 的下一个错误行为)。
我可以用来解决根本原因的任何策略想法吗?为什么“正常”统计数据还不够?
另一个 SQL 服务器问题:我有一个简单的查询,它提供了自计数器重置以来 CPU 最密集的 SQL:
select top 10
sum(qs.total_worker_time) as total_cpu_time,
sum(qs.execution_count) as total_execution_count,
qs.plan_handle, st.text
from
sys.dm_exec_query_stats qs
cross apply sys.dm_exec_sql_text(qs.plan_handle) as st
group by qs.plan_handle, st.text
order by sum(qs.total_worker_time) desc
Run Code Online (Sandbox Code Playgroud)
问题1:究竟是什么plan_handle
?它似乎不是计划的散列,就像在 Oracle 中一样。我问是因为我希望能够检测语句的计划发生变化的情况。
问题2:一旦有了plan_handle,我就对实际的计划感兴趣。所以我这样做,例如:
select * from sys.dm_exec_query_plan (0x060006001F176406B8413043000000000000000000000000)
Run Code Online (Sandbox Code Playgroud)
在 query_plan 列中,我得到一个链接,单击该链接时会显示一个 XML 文档。如果我将它作为whatever.sqlplan 保存在磁盘上,我可以在Windows 中双击它并在Management Studio 中正确显示。一定有办法避免这一步吗?!
问题 3:有没有办法将 XML 转换回文本格式,就像过去的 SET SHOWPLAN_TEXT 一样?我希望能够以图形方式查看它们,但也希望以某种有意义的方式自动比较它们。
谢谢!