如何查看SQL Server表的读/写统计信息?

问题描述 投票:0回答:4

有没有办法找到SQL Server 2005/2008上表读写次数的统计信息?

我专门寻找

DMVs/DMFs
,而不使用触发器或审核。

这里的目标是找出索引的适当填充因子 - 从这篇文章中得到了一个想法(定义的填充因子)。


[更新]关于ServerFault有一个后续问题
如何确定 读/写密集表 DMV/DMF 统计

sql-server t-sql statistics fillfactor
4个回答
25
投票

以下查询可用于查找数据库中所有表的读写次数。该查询结果可以导出为CSV文件,然后使用Excel公式可以轻松计算读/写比率。在规划表上的索引时非常有用

DECLARE @dbid int
SELECT  @dbid = db_id('database_name')

SELECT TableName = object_name(s.object_id)
    , Reads = SUM(user_seeks + user_scans + user_lookups)
    , Writes =  SUM(user_updates)
FROM sys.dm_db_index_usage_stats AS s
INNER JOIN sys.indexes AS i
     ON s.object_id = i.object_id
    AND i.index_id = s.index_id
WHERE objectproperty(s.object_id,'IsUserTable') = 1
AND s.database_id = @dbid
GROUP BY object_name(s.object_id)
ORDER BY Writes DESC

15
投票

记住“表”意味着聚集索引或“堆”。


3
投票

要确定表索引的适当填充因子,您需要查看发生的页面拆分数量。这显示在

sys.dm_db_index_operational_stats
:

叶子分配计数:索引叶子级别的页面拆分总数。

非叶分配计数:索引叶级以上的页面拆分总数。

叶页合并计数:索引叶级的页合并总数。

经过一番挖掘后,我看到一些帖子说 DMV 的页面分割数没有那么有用(我个人还没有证实这一点),但还有一个性能计数器“页面分割/秒” “(但它仅在 SQL Server 实例级别)。

我使用的经验法则是,普通表使用默认的 90% 填充因子,高插入表使用 70 - 85% 之间的填充因子(取决于行大小)。只读表可以使用 100% 的填充因子


1
投票

如果您有一个良好的聚集索引(即不断增加、唯一、狭窄),那么填充因子的真正决定性问题是表的更新方式和列的数据类型。 如果列都是固定大小(例如整数、小数、浮点、字符)且不可为空,则更新无法增加行所需的存储空间。考虑到良好的聚集索引,您应该选择 90+ 甚至 100 的填充因子,因为不会发生页面拆分。 如果您有一些可变长度列(例如用于保存用户名的 Varchar)并且这些列在插入后很少更新,那么您仍然可以保持相对较高的填充因子。 如果您的数据长度变化很大(例如 UNC 路径、注释字段、XML),则应减小填充因子。特别是如果列经常更新并增长(如评论列)。 非聚集索引通常是相同的,只是索引键可能有更多问题(非唯一,可能不会增加)。 我认为 sys.dm_db_index_physical_stats 给出了最佳指标,但这是事后的结果。查看平均/最小/最大记录大小、平均碎片大小、平均页面空间,以了解索引空间的使用情况。 HTH.

© www.soinside.com 2019 - 2024. All rights reserved.