如何找出SQL Server表的读/写统计信息?

时间:2009-10-15 23:31:26

标签: sql-server tsql statistics fillfactor

有没有办法在SQL Server 2005/2008 上查找有关表读取和写入计数的统计信息?

我特意在不使用触发器或审核的情况下寻找DMVs/DMFs

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


  

[更新] 关于ServerFault的跟进问题是How to determine Read/Write intensive table from DMV/DMF statistics

4 个答案:

答案 0 :(得分:19)

以下查询可用于查找数据库中所有表的读写次数。此查询结果可以导出为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

答案 1 :(得分:10)

记住'table'表示聚集索引或'heap'。

答案 2 :(得分:3)

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

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

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

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

在做了一些挖掘之后,我看到一些帖子说DMV中的页面分割数字没那么有用(我没有亲自证实这一点),但还有一个性能计数器“页面拆分/ sec“(但它仅在SQL Server实例级别)。

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

答案 3 :(得分:1)

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

相关问题