SQL Server 是否维护每个表的读取、写入、更新时间等统计信息?
我们想知道我们的 ERP 应用程序在哪些表上花费的时间最多,并开始寻找优化表的方法。
SQL Server 是否维护每个表的读取、写入、更新时间等统计信息?
我们想知道我们的 ERP 应用程序在哪些表上花费的时间最多,并开始寻找优化表的方法。
好吧,SQL Server 不会按表名跟踪这些统计信息。但是您可以查看 DMV 之类sys.dm_exec_query_stats
的查询,了解哪些查询花费的时间最长。
SELECT [sql] = SUBSTRING
(
st.[text],
(s.statement_start_offset/2)+1,
(CASE s.statement_end_offset
WHEN -1 THEN DATALENGTH(CONVERT(NVARCHAR(MAX), st.[text]))
ELSE s.statement_end_offset END
- s.statement_start_offset)/2
), s.*
FROM sys.dm_exec_query_stats AS s
CROSS APPLY sys.dm_exec_sql_text(s.[sql_handle]) AS st
WHERE s.execution_count > 1
AND st.[dbid] = DB_ID('Your_ERP_Database_Name')
ORDER BY total_worker_time*1.0 / execution_count DESC;
当然,您可以按您想要的任何指标进行排序,然后快速查看第一列,看看您是否发现任何看起来可疑的东西。
您还可以查看sys.dm_exec_procedure_stats
以识别消耗高持续时间或读取的过程。
请记住,这些和其他 DMV 会针对各种事件(包括重新启动、服务重新启动等)进行重置。因此,如果您想保留这些指标的运行历史以进行趋势/基准测试/比较,您将不得不自己对它们进行快照,或者获得可以帮助解决这个问题的第 3 方产品(例如SQL Sentry Performance Advisor)以及更多其他产品。
免责声明:我为 SQL Sentry 工作。
您可以按照以下链接创建 SQL Server 审核:
http://msdn.microsoft.com/en-us/library/cc280386(v=sql.105).aspx
SQL Server 确实捕获了您询问的信息,但它是基于每个索引,而不是每个表 - 查看 sys.dm_db_index_operational_stats 和 sys.dm_db_index_usage_stats。您必须根据 object_id 聚合数据以获取表信息。但是,有一些注意事项 - 例如,如果未使用索引(不读取也不写入),它将不会显示在输出中。这些统计信息在实例重新启动时重置,并且有一个错误导致它们在 index_usage_stats 在重建索引时被重置(https://connect.microsoft.com/SQLServer/feedback/details/739566/rebuilding-an-index- clears-stats-from-sys-dm-db-index-usage-stats)。而且,DMV 的输出之间存在显着差异 - 查看 Craig Freedman 的帖子了解更多信息(http://blogs.msdn.com/b/craigfr/archive/2008/10/30/what-is-the-difference-between-sys-dm-db-index-usage-stats-and-sys-dm- db-index-operational-stats.aspx)。
更大的问题是,你想通过这些信息解决什么问题?我同意 Aaron 的观点,即从优化的角度来看,查找需要很长时间的查询是一个更好的起点。但是,我想让你知道 SQL Server 确实有这些信息。
我们使用来自Adam Mechanics 博客的sp_whoisActive 。
它为我们提供了服务器上当前正在发生的事情的快照,以及语句正在使用的执行计划。
它易于使用且免费。