有没有办法在 SQL Server 2005/2008上找到有关表读取和写入计数的统计信息?
我专门寻找DMVs/DMFs
不使用触发器或审计。
这里的目标是为索引找出合适的填充因子- 从这篇文章中得到一个想法(填充因子定义)。
[更新] ServerFault 上有一个后续问题
How to determine Read/Write intensive table from DMV/DMF statistics
有没有办法在 SQL Server 2005/2008上找到有关表读取和写入计数的统计信息?
我专门寻找DMVs/DMFs
不使用触发器或审计。
这里的目标是为索引找出合适的填充因子- 从这篇文章中得到一个想法(填充因子定义)。
[更新] ServerFault 上有一个后续问题
How to determine Read/Write intensive table from DMV/DMF statistics
以下查询可用于查找数据库中所有表的读写次数。此查询结果可以导出为 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
记住“表”是指聚集索引或“堆”。
要确定表索引的适当填充因子,您需要查看发生的页面拆分数。这显示在sys.dm_db_index_operational_stats
:
叶分配计数:索引叶级别的页面拆分总数。
非叶分配计数:索引叶级别以上的页面拆分总数。
叶页面合并计数:索引叶级别的页面合并总数。
在进行了一些挖掘之后,我看到一些帖子说来自 DMV 的页面拆分数没有那么有用(我没有亲自确认这一点),但是还有一个性能计数器“page splits/sec” (但它仅在 SQL Server 实例级别)。
我使用的经验法则是普通表使用默认的 90% 填充因子,高插入表在 70-85% 之间(取决于行大小)。只读表可以使用 100% 的填充因子
如果您有一个良好的聚集索引(即不断增加的、唯一的、窄的),那么填充因子的真正决定性问题是表的更新方式和列的数据类型。如果列都是固定大小(例如,整数、小数、浮点数、字符)且不可为空,则更新无法增加行所需的存储空间。鉴于良好的聚集索引,您应该选择 90+ 甚至 100 的填充因子,因为不会发生页面拆分。如果您有一些可变长度的列(例如,保存用户名的 Varchar)并且在插入后很少更新这些列,那么您仍然可以保持相对较高的填充因子。如果您有长度变化很大的数据(例如,UNC 路径、注释字段、XML),则应降低填充因子。特别是如果列经常更新并增长(如评论列)。非聚集索引通常是相同的,除了索引键可能更成问题(非唯一,可能永远不会增加)。我认为 sys.dm_db_index_physical_stats 给出了最好的指标,但这是事后的。查看 avg/min/max 记录大小、avg frag 大小、avg page space 用于了解索引空间的使用情况。HTH。