如何删除全文搜索(FTS)内部分区?附查询结果说明
删除SQL Server全文搜索(FTS)内部分区的方法
你查到的ifts_comp_fragment_xxx是全文索引在维护、同步过程中产生的内部碎片分区,这类系统生成的分区无法直接通过删除分区命令清理,需要通过重建全文索引的方式来彻底清理这些碎片。
步骤1:确认碎片关联的全文索引信息
先执行以下查询,明确这些碎片对应的表、全文索引和目录,确保操作对象准确:
SELECT so.name AS fragment_name, fi.name AS fulltext_index_name, t.name AS table_name, SCHEMA_NAME(t.schema_id) AS table_schema, fc.name AS fulltext_catalog_name FROM sys.partitions p INNER JOIN sys.sysobjects so ON p.object_id = so.id INNER JOIN sys.fulltext_indexes fi ON so.parent_obj = fi.object_id INNER JOIN sys.tables t ON fi.object_id = t.object_id INNER JOIN sys.fulltext_catalogs fc ON fi.fulltext_catalog_id = fc.fulltext_catalog_id WHERE so.name LIKE 'ifts_comp_fragment_%' AND p.partition_number > 1;
步骤2:批量重建关联的全文索引
通过动态SQL批量处理所有涉及的表,先停用再重建全文索引,自动清理内部碎片:
DECLARE @sql NVARCHAR(MAX) = N''; SELECT @sql += N' -- 处理表 ' + SCHEMA_NAME(t.schema_id) + N'.' + t.name + N' ALTER FULLTEXT INDEX ON [' + SCHEMA_NAME(t.schema_id) + N'].[' + t.name + N'] DISABLE; ALTER FULLTEXT INDEX ON [' + SCHEMA_NAME(t.schema_id) + N'].[' + t.name + N'] REBUILD; ' FROM sys.partitions p INNER JOIN sys.sysobjects so ON p.object_id = so.id INNER JOIN sys.fulltext_indexes fi ON so.parent_obj = fi.object_id INNER JOIN sys.tables t ON fi.object_id = t.object_id WHERE so.name LIKE 'ifts_comp_fragment_%' AND p.partition_number > 1 GROUP BY SCHEMA_NAME(t.schema_id), t.name; -- 避免重复处理同一个表 EXEC sp_executesql @sql;
步骤3:验证清理效果
重新运行你最初的查询,确认多余的分区已被清理:
SELECT so.name, p.* FROM sys.partitions p INNER JOIN sys.sysobjects so ON p.object_id = so.id WHERE partition_number > 1 OPTION (RECOMPILE);
注意事项
- 重建全文索引会占用一定系统资源,建议在业务低峰期执行
- 若全文目录数据量较大,重建耗时会较长,需提前评估对业务的影响
- 禁止直接删除
ifts_comp_fragment_xxx这类系统对象,会导致全文索引损坏甚至失效
内容的提问来源于stack exchange,提问作者ZedZip
相关产品推荐
相关产品推荐

