【问题标题】:How to determine the size of a Full-Text Index on SQL Server 2008 R2?如何确定 SQL Server 2008 R2 上全文索引的大小?
【发布时间】:2011-01-28 22:16:02
【问题描述】:

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

有没有办法做到这一点?

【问题讨论】:

标签: sql-server-2008-r2 size server-administration sql-server-administration


【解决方案1】:

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

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

【讨论】:

  • 谢谢!我需要一些时间来检查一下,因为我已经有一段时间没有从事这个项目了......
  • @Poli 是的,我不确定是什么在这个问题被问到两年后引起了我的注意。
  • 这似乎是全文片段的未压缩大小。通过查看sys.internal_table,您可以获得压缩片段的大小以及全文基础设施其余部分所需的空间。有关示例查询,请参阅我的答案。
【解决方案2】:

如果您追求特定的目录 使用 SSMS - 点击[数据库]并展开对象 - 点击[存储] - 右键单击​​{特定目录} - 选择属性并单击。 在 General TAB.. 你会发现 Catalog Size = 'nn'

【讨论】:

    【解决方案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 年以来就存在。

    【讨论】:

      猜你喜欢
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多