Я написал запрос ниже, чтобы помочь мне определить, какие должны быть реорганизованы или переиндексирован индексы и хотел бы знать, как исключить системные индексы из результатов:Как определить, является ли индекс системным индексом в 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.
смотрите также http://dba.stackexchange.com/questions/60555/how-to-retrieve-whether-database-has-any-tables/60556#60556 – AakashM