我已经在我们的一个SQL Server(当前所有的2008)上实现了一个系统,它读取了我们表上的索引(而不是PK)的大小和用法,并将这些信息历史地存储在专用数据库中。
每个索引在表a中获得一个自己的SID,每次索引大小或用法改变一个指定值时,就会创建表b中的新条目,旧条目设置为非活动状态(SCD2)。 这些工作每天运行一次。
问题:在非常罕见的情况下,我为一些索引获得了两行大小,到目前为止,它只发生在超过1000个被监视的3个表中。
我从哪里获得数据:
FROM IndexInfo.IndexOverview io
JOIN IndexInfo.IndexSizeUsage isu ON io.IndexOverviewSid = isu.IndexOverviewSid
JOIN XYZ.sys.partitions p ON io.object_id = p.object_id AND io.index_id = p.index_id
JOIN ( SELECT container_id, SUM(total_pages) total_pages, SUM(used_pages) used_pages
FROM XYZ.sys.allocation_units
GROUP BY container_id) a ON p.partition_id= a.container_id
LEFT JOIN (SELECT object_id, index_id, ISNULL(100.0*(user_lookups+user_scans+user_seeks)
/ NULLIF((SELECT SUM(user_lookups+user_scans+user_seeks)
FROM XYZ.sys.dm_db_index_usage_stats indusinner
WHERE indusinner.database_id=indusout.database_id AND indusinner.object_id=indusout.object_id
GROUP by object_id),0),0) usage
FROM XYZ.sys.dm_db_index_usage_stats indusout WHERE database_id=DB_ID('XYZ')) usageselect ON io.object_id=usageselect.object_id AND io.index_id=usageselect.index_id
这是重要的一部分。 IndexOverview(表a):每个创建的用户索引一个条目 IndexSizeUsage(表b):使用的SCD2数据和索引大小(当错误发生时,每个索引只有1个活动条目)
结果: 表b中的两行用于表a中的条目,而行中的唯一差异是来自表a的信息。由于表a是由我用于连接的唯一值分组,SQL Server以某种方式在读取数据时创建第二个分区。
我尝试通过在重新组织/重建索引时手动执行此查询来复制问题(在调度作业时不应该发生这种情况),并通过执行大型插入操作来强制索引增长。
SQL Server何时以及为何暂时创建第二个分区?