8

我有一个 SQL 2008 R2 数据库,上面有一些表,其中一些表定义了全文索引。我想知道如何确定特定表的索引大小,以便控制和预测它的增长。

有没有办法做到这一点?

4

3 回答 3

15

目录视图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;

另请注意,如果片段数很高,您可能会考虑进行重组。

于 2012-09-18T12:52:27.070 回答
3

如果您在使用特定目录使用 SSMS - 单击 [Database] 并展开对象 - 单击 [Storage] - 右键单击​​ {Specific Catalogue} - 选择属性并单击。IN General TAB.. 你会发现 Catalog Size = 'nn'

于 2014-03-13T23:49:30.610 回答
3

我使用与此类似的东西(它还将计算 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 年以来就存在。

于 2017-07-26T12:14:19.797 回答