2016-09-13 2 views
2

Я написал запрос ниже, чтобы помочь мне определить, какие должны быть реорганизованы или переиндексирован индексы и хотел бы знать, как исключить системные индексы из результатов:Как определить, является ли индекс системным индексом в SQL Server?

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 

А затем включают в себя следующее в где:

and t.is_ms_shipped = 0 

Это исключает некоторые, но не все системные таблицы. Каков предпочтительный способ определить, является ли индекс системным индексом?

Я мог исключить их по имени, но это не кажется очень изящным.

Версия SQL Server я использую 2012.

ответ

1

Посмотрев возможные решения этой проблемы индекс системы только таблицы, я получаю после исключая «is_ms_shipped» от стола «sysdiagrams», так что я просто исключить эту таблицу в предложении где:

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') 
+0

смотрите также http://dba.stackexchange.com/questions/60555/how-to-retrieve-whether-database-has-any-tables/60556#60556 – AakashM