2009-10-15 45 views
9

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

我特别在寻找DMVs/DMFs而不使用触发器或审计。

目标这里是要找出适当填充系数指标 - 得到了这篇文章(Fill Factor Defined)的想法。


[UPDATE]上有ServerFault
How to determine Read/Write intensive table from DMV/DMF statistics

+0

问题当前的链接重定向到似乎是病毒。 – 2017-05-05 12:58:47

回答

8

记住'表'表示聚集索引或'堆'。

+0

@Remus:经过一番调查,上述所有DMV/DMF的组合都是我需要找出填充因子值来设置的。稍后我会问一个跟进问题,看看我是否提出了正确或不正确的问题。谢谢,Remus。 – Sung 2009-10-16 14:07:48

3

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

叶分配计数:索引叶级别处的页分裂总数。

非叶分配数:索引叶级以上的页分裂总数。

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

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

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

+0

@Mitch:在更新叶子/非叶子分配数量较高的某些高度更新的表上的填充因子后,让我看看“DMV中的页面拆分数字没有那么有用”,然后回到这个问题上。谢谢你为我指出这一点。 – Sung 2009-10-16 14:08:50

17

以下查询可用于查找数据库中所有表的读取和写入次数。这个查询结果可以导出到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 
+0

我们可以有日期过滤器吗? – 2016-04-27 09:54:59

+0

不,我们不能拥有日期过滤器@PhilipMorris – 2016-04-29 03:44:48

1

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

相关问题