全文索引填充

创建和维护全文索引涉及使用称为“填充”(也称为“爬网”)的进程填充索引。SQL Server 支持以下类型的填充:完全填充、基于更改跟踪的自动或手动填充,以及基于时间戳的增量式填充。

完全填充

在完全填充期间,为表或索引视图的所有行生成索引条目。全文索引的完全填充为基表或索引视图的所有行生成索引条目。

默认情况下,一旦创建新的全文索引,SQL Server 便会对其进行完全填充。但是,完全填充会占用相当多的资源。因此,当在高峰期创建全文索引时,最佳做法通常是将完全填充推迟到非高峰时段,当全文索引的基表非常大时更应如此。不过,索引所属的全文目录在填充其所有全文索引之后才可使用。若要创建一个全文索引而不立即填充它,请在 CREATE FULLTEXT INDEX Transact-SQL 语句中指定 CHANGE_TRACKING OFF、NO POPULATION 子句。SQL Server 将在您执行使用 START FULL POPULATION 或 START INCREMENTAL POPULATION 子句的 ALTER FULLTEXT INDEX Transact-SQL 语句时填充新建的全文索引。有关详细信息,请参阅本主题后面的示例“A. 创建全文索引而不运行完全填充”和“B. 对表运行完全填充”。

基于更改跟踪的填充

或者,您可以在对全文索引进行初始完全填充之后使用更改跟踪对其进行维护。将出现与更改跟踪关联的较小开销,因为 SQL Server 维护它用来跟踪自上次填充后对基表所做更改的表。当使用更改跟踪时,SQL Server 维护基表或索引视图中已通过更新、删除或插入进行过修改的行的记录。通过 WRITETEXT 和 UPDATETEXT 所做的数据更改不会反映到全文索引中,也不能使用更改跟踪方法拾取。

注意注意

对于包含 timestamp 列的表,可以使用增量填充。

如果在创建索引期间启用更改跟踪,则 SQL Server 将在新全文索引创建之后立即对其进行完全填充。其后,将跟踪更改并将更改传播到全文索引。有两类更改跟踪:自动(CHANGE_TRACKING AUTO 选项)和手动(CHANGE_TRACKING MANUAL 选项)。自动更改跟踪为默认行为。

更改跟踪的类型确定全文索引的填充方式,如下所示:

  • 自动填充

    默认情况下,或者如果您指定 CHANGE_TRACKING AUTO,全文引擎将对全文索引使用自动填充。完成首次完全填充之后,当修改基表中的数据时将跟踪更改并自动传播跟踪的更改。不过,由于全文索引是在后台更新的,因此传播的更改可能不会立即反映到索引中。

    设置使用自动填充的跟踪更改

    有关详细信息,请参阅本主题后面的示例“E. 更改全文索引以使用自动更改跟踪”。

  • 手动填充

    如果您指定 CHANGE_TRACKING MANUAL,则全文引擎将对全文索引使用手动填充。完成首次完全填充之后,当修改基表中的数据时将跟踪更改。但是,这些更改不会传播到全文索引,直至您执行 ALTER FULLTEXT INDEX … START UPDATE POPULATION 语句。您可以使用 SQL Server 代理来定期调用此 Transact-SQL 语句。

    启动使用手动填充的跟踪更改

    有关详细信息,请参阅本主题后面的示例“C. 使用手动更改跟踪创建全文索引”和“D. 运行手动填充”。

设置不带更改跟踪的跟踪更改

基于时间戳的增量填充

增量填充是手动填充全文索引的一种替代机制。您可以对 CHANGE_TRACKING 设置为 MANUAL 或 OFF 的全文索引运行增量填充。如果全文索引的第一个填充是增量填充,它将对所有行编制索引并使其等效于完全填充。增量填充要求索引表必须具有 timestamp 数据类型的列。如果 timestamp 列不存在,则无法执行增量填充。对不含 timestamp 列的表请求增量填充会导致完全填充操作。另外,如果影响表全文索引的任意元数据自上次填充以来发生了变化,则增量填充请求将作为完全填充来执行。这包括更改任何列、索引或全文索引定义所引起的元数据更改。

SQL Server 使用 timestamp 列标识自上次填充后发生更改的行。然后,增量填充在全文索引中更新上次填充的当时或之后添加、删除或修改的行。如果对表进行大量插入操作,则使用增量填充会较使用手动填充有效。

在填充结束时,全文引擎将记录新的 timestamp 值。该值是 SQL 收集器遇到的最大 timestamp 值。以后再启动增量填充时,将会使用此值。

若要运行增量填充,请执行使用 START INCREMENTAL POPULATION 子句的 ALTER FULLTEXT INDEX 语句。

安排增量填充作业

示例

注意注意

本节中的示例使用 AdventureWorks 示例数据库的 Production.Document 或 HumanResources.JobCandidate 表。有关这些表的信息,请参阅文档表和 JobCandidate 表 (AdventureWorks)

A. 创建全文索引而不运行完全填充

以下示例对 AdventureWorks 示例数据库的 Production.Document 表创建全文索引。该示例使用 WITH CHANGE_TRACKING OFF, NO POPULATION 来延迟初次完全填充。

CREATE UNIQUE INDEX ui_ukDoc ON Production.Document(DocumentID);
CREATE FULLTEXT CATALOG AW_Production_FTCat;
CREATE FULLTEXT INDEX ON Production.Document
(
    Document                         --Full-text index column name 
        TYPE COLUMN FileExtension    --Name of column that contains file type information
        Language 1033                 --1033 is LCID for the English language
)
    KEY INDEX ui_ukDoc
    ON AW_Production_FTCat
    WITH CHANGE_TRACKING OFF, NO POPULATION;
GO

B. 对表运行完全填充

以下示例对 AdventureWorks 示例数据库的 Production.Document 表运行完全填充。

ALTER FULLTEXT INDEX ON Production.Document
   START FULL POPULATION;

C. 使用手动更改跟踪创建全文索引

以下示例对 AdventureWorks 示例数据库的 HumanResources.JobCandidate 表创建全文索引,该全文索引将使用具有手动填充的更改跟踪。

USE AdventureWorks;
GO
CREATE UNIQUE INDEX ui_ukJobCand ON HumanResources.JobCandidate(JobCandidateID);
CREATE FULLTEXT CATALOG ft AS DEFAULT;
CREATE FULLTEXT INDEX ON HumanResources.JobCandidate(Resume) 
   KEY INDEX ui_ukJobCand 
   WITH CHANGE_TRACKING=MANUAL;
GO

D. 运行手动填充

以下示例对 AdventureWorks 示例数据库的 HumanResources.JobCandidate 表的更改跟踪全文索引运行手动填充。

USE AdventureWorks;
GO
ALTER FULLTEXT INDEX ON HumanResources.JobCandidate START UPDATE POPULATION;
GO

E. 更改全文索引以使用自动更改跟踪

以下示例更改 AdventureWorks 示例数据库的 HumanResources.JobCandidate 表的全文索引以使用自动填充的更改跟踪。

USE AdventureWorks;
GO
ALTER FULLTEXT INDEX ON HumanResources.JobCandidate SET CHANGE_TRACKING AUTO;
GO