我已经编写了下面的查询来帮助我确定哪些索引需要重新组织或重新编制索引,并且想知道如何从结果中排除系统索引:
SELECT OBJECT_NAME([stats].[object_id]) AS [TableName],
i.name AS [IndexName],
index_type_desc,
avg_fragmentation_in_percent,
fragment_count,
avg_fragment_size_in_pages
FROM
[sys].[dm_db_index_physical_stats](DB_ID(), NULL, NULL, NULL, NULL) AS stats
LEFT OUTER JOIN sys.indexes AS i ON i.object_id = stats.object_id
AND i.index_id = stats.index_id
WHERE i.name is not null
ORDER BY [TableName] asc
这样的结果给了我我需要的东西,但是它们也包括系统索引,我不想包括它们。在对可能的解决方案进行一些研究之后,我看到的是查看' is_ms_shipped'因此,在查询的连接中包含以下内容:
LEFT OUTER JOIN sys.tables AS t on t.object_id = stats.object_id
然后在where子句中包含以下内容:
and t.is_ms_shipped = 0
这确实排除了一些但不是所有系统表。确定索引是否为系统索引的首选方法是什么?
我可以通过名字排除它们,但这似乎并不优雅。
我使用的SQL Server版本是2012。
答案 0 :(得分:1)
在研究了这个问题的可能解决方案之后,我在排除'is_ms_shipped'后收到的唯一表系统索引来自'sysdiagrams'表,所以我只是在where子句中排除了这个表:
LEFT OUTER JOIN sys.tables AS t on t.object_id = stats.object_id
WHERE (i.name IS NOT NULL) and (t.is_ms_shipped = 0) and (t.name != 'sysdiagrams')