SQL Server有时会临时分区索引

时间:2015-02-05 09:29:04

标签: sql-server-2008 indexing partitioning database-indexes

我已经在我们的一个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何时以及为何暂时创建第二个分区?

0 个答案:

没有答案