Как определить размер полнотекстового индекса в SQL Server 2008 R2?
У меня есть база данных SQL 2008 R2 с несколькими таблицами, в которых для некоторых из этих таблиц определен полнотекстовый индекс. Я хотел бы знать, как определить размер индекса конкретной таблицы, чтобы контролировать и прогнозировать его рост.
Есть ли способ сделать это?
3 ответа
Просмотр каталога sys.fulltext_index_fragments
отслеживает размер каждого фрагмента, независимо от каталога, поэтому вы можете взять SUM
сюда. Это предполагает, что ограничение одного полнотекстового индекса на таблицу останется в силе. Следующий запрос даст вам размер каждого полнотекстового индекса в базе данных, опять же независимо от каталога, но вы можете использовать WHERE
пункт, если вы заботитесь только о конкретной таблице.
SELECT
[table] = OBJECT_SCHEMA_NAME(table_id) + '.' + OBJECT_NAME(table_id),
size_in_KB = CONVERT(DECIMAL(12,2), SUM(data_size/1024.0))
FROM sys.fulltext_index_fragments
-- WHERE table_id = OBJECT_ID('dbo.specific_table_name')
GROUP BY table_id;
Также обратите внимание, что если количество фрагментов велико, вы можете подумать о реорганизации.
Если вам нужен определенный каталог, используйте SSMS - Кликните на [База данных] и разверните объекты - Нажмите на [Хранилище] - Щелкните правой кнопкой мыши на {Определенный каталог} - Выберите Propertie и нажмите. В общем TAB.. Вы найдете Размер каталога = 'nn'
Я использую что-то похожее на это (который также будет рассчитывать размер 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 года.