я использую что-то вроде этого (который будет также рассчитать размер XML-индексов, ... если он присутствует)
SELECT S.name,
SO.name,
SIT.internal_type_desc,
rows = CASE WHEN GROUPING(SIT.internal_type_desc) = 0 THEN SUM(SP.rows)
END,
TotalSpaceGB = SUM(SAU.total_pages) * 8/1048576.0,
UsedSpaceGB = SUM(SAU.used_pages) * 8/1048576.0,
UnusedSpaceGB = SUM(SAU.total_pages - SAU.used_pages) * 8/1048576.0,
TotalSpaceKB = SUM(SAU.total_pages) * 8,
UsedSpaceKB = SUM(SAU.used_pages) * 8,
UnusedSpaceKB = SUM(SAU.total_pages - SAU.used_pages) * 8
FROM sys.objects SO
INNER JOIN sys.schemas S ON S.schema_id = SO.schema_id
INNER JOIN sys.internal_tables SIT ON SIT.parent_object_id = SO.object_id
INNER JOIN sys.partitions SP ON SP.object_id = SIT.object_id
INNER JOIN sys.allocation_units SAU ON (SAU.type IN (1, 3)
AND SAU.container_id = SP.hobt_id)
OR (SAU.type = 2
AND SAU.container_id = SP.partition_id)
WHERE S.name = 'schema'
--AND SO.name IN ('TableName')
GROUP BY GROUPING SETS(
(S.name,
SO.name,
SIT.internal_type_desc),
(S.name, SO.name), (S.name),())
ORDER BY S.name,
SO.name,
SIT.internal_type_desc;
Это, как правило, дает числа выше sys.fulltext_index_fragments
, но в сочетании с sys.partitions
таблицы он будет содержать цифры, возвращаемые с EXEC sys.sp_spaceused @objname = N'schema.TableName';
.
Испытано с SQL Server 2016, но документация говорит она должна присутствовать с 2008 года
Может быть, это может быть полезно: http://technet.microsoft.com/en-us/library/ms190370.aspx (IndexSize свойство) –
* IndexSize * фактически возвращает размер каталога FTS, а каталог может иметь более одного индекса. Я хочу, чтобы размер каждого индекса был индивидуальным. – Poli