Помню, в SQL Server 2000 часто возникала задача определить, какое на данный момент сложилось соотношение распределения страниц данных, индексов и блобов для всех таблиц и индексированных представлений. Это соотношение, иногда, давало очень неожиданные результаты, которые заставляли задуматься. Давно хотел это сделать, и вот выкладываю простой сценарий, который не работает правильно в последующих версиях…

SELECT * FROM ( SELECT OBJECT_NAME(id) AS [Имя объекта] ,(SELECT 8 * SUM([sidx].[dpages])/1024 FROM sysindexes AS [sidx] WHERE [sidx].[indid] < 2 AND [sidx].[id] = [sob].[id]) AS [Занято данными (МБ)] ,(SELECT 8 * SUM(ISNULL([sidx].[used],0) - ISNULL([sidx].[dpages],0))/1024 FROM dbo.sysindexes AS [sidx] WHERE [sidx].[indid] < 2 AND [sidx].[id] = [sob].[id]) AS [Занято индексами (МБ)] ,ISNULL((SELECT 8 * SUM(ISNULL([sidx].[used],0))/1024 FROM sysindexes AS [sidx] WHERE [sidx].[indid] = 255 AND [sidx].[id] = [sob].[id]),0) AS [Занято под BLOB (МБ)] ,(SELECT 8 * SUM(ISNULL([sidx].[reserved],0))/1024 FROM sysindexes AS [sidx] WHERE [sidx].[indid] <= 255 AND [sidx].[id] = [sob].[id]) AS [Зарезервировано (МБ)] FROM sysobjects AS [sob] WHERE ( [sob].[type] = 'U' OR [sob].[type] = 'S' ) AND OBJECTPROPERTY([sob].[id], 'IsSystemTable') = 0 UNION ALL -- Объединяем с данными о материализованных представлениях SELECT OBJECT_NAME(id) AS [Имя объекта] ,0 AS [Занято данными (МБ)] ,(SELECT 8 * SUM(ISNULL([sidx].[used],0))/1024 FROM sysindexes AS [sidx] WHERE [sidx].[indid] < 2 AND [sidx].[id] = [sob].[id]) AS [Занято индексами (МБ)] ,0 AS [Занято под BLOB (МБ)] ,(SELECT 8 * SUM(ISNULL([sidx].[reserved],0))/1024 FROM sysindexes AS [sidx] WHERE [sidx].[indid] <= 255 AND [sidx].[id] = [sob].[id]) AS [Зарезервировано (МБ)] FROM sysobjects AS [sob] WHERE ( OBJECTPROPERTY([sob].[id], 'IsView') = 1 AND OBJECTPROPERTY([sob].[id], 'IsIndexed') = 1 ) AND OBJECTPROPERTY([sob].[id], 'IsSystemTable') = 0 ) AS [sub] ORDER BY [Зарезервировано (МБ)] DESC