全文檢索索引母體擴展

建立和維護全文檢索索引包括使用稱為「母體擴展」(Population) (也稱為「搜耙」(Crawl)) 的處理序來擴展索引。SQL Server 支援下列母體擴展類型:完整母體擴展、以變更追蹤為基礎的自動或手動母體擴展,以及以時間戳記為基礎的累加母體擴展。

完整母體擴展

在完整母體擴展期間,系統會針對資料表或索引檢視表的所有資料列建立索引項目。全文檢索索引的完整母體擴展會針對基底資料表或索引檢視表的所有資料列建立索引項目。

根據預設,SQL Server 會在建立新的全文檢索索引時,立即進行完整母體擴展。不過,完整母體擴展可能會耗用大量資源。因此,在尖峰期間建立全文檢索索引時,最佳作法通常是延遲完整母體擴展直到離峰時間為止,尤其是全文檢索索引的基底資料表很龐大時。不過,此索引所屬的全文檢索目錄要等到所有全文檢索索引都擴展之後才能使用。若要建立全文檢索索引,但不立即擴展,請在您的 CREATE FULLTEXT INDEX Transact-SQL 陳述式中指定 CHANGE_TRACKING OFF, NO POPULATION 子句。在您使用 START FULL POPULATION 或 START INCREMENTAL POPULATION 子句來執行 ALTER FULLTEXT INDEX Transact-SQL 陳述式之前,SQL Server 將不會擴展新的全文檢索索引。如需詳細資訊,請參閱本主題稍後的範例「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 Agent 來定期呼叫這個 Transact-SQL 陳述式。

    若要使用手動母體擴展來啟動追蹤變更

    如需詳細資訊,請參閱本主題稍後的範例「C.使用手動變更追蹤來建立全文檢索索引」以及「D.執行手動母體擴展」。

若要關閉變更追蹤

以時間戳記為基礎的累加母體擴展

累加母體擴展是手動擴展全文檢索索引的替代機制。您可以針對將 CHANGE_TRACKING 設定為 MANUAL 或 OFF 的全文檢索索引執行累加母體擴展。如果全文檢索索引的第一個母體擴展是累加母體擴展,它就會建立所有資料列的索引,讓它相當於完整母體擴展。

累加母體擴展的執行要件是,索引資料表必須包含 timestamp 資料類型資料行。少了 timestamp 資料行,就無法執行累加母體擴展。對不含 timestamp 資料行的資料表提出累加母體擴展要求的話,會導致執行完整母體擴展作業。此外,如果上一次母體擴展以來,影響資料表全文檢索索引的任何中繼資料已變更,便會以完整母體擴展的方式實作累加母體擴展。這包括由於更改任何資料行、索引或全文檢索索引定義所導致的中繼資料變更。

SQL Server 會使用 timestamp 資料行來識別上一次母體擴展以來已經變更的資料列。然後,累加母體擴展會針對在上一次母體擴展之後或進行時加入、刪除或修改的資料列,更新全文檢索索引。如果資料表遇到大量插入作業,使用累加母體擴展可能會比使用手動母體擴展更有效率。

母體擴展結束時,全文檢索引擎會記錄新的 timestamp 值。這個值就是「SQL 收集程式」所遇過的最大 timestamp 值。此值會在後續的累加母體擴展啟動時使用。

若要執行累加母體擴展,請使用 START INCREMENTAL POPULATION 子句來執行 ALTER FULLTEXT INDEX 陳述式。

若要排程累加母體擴展作業

範例

[!附註]

本節中的範例會使用 AdventureWorks2008R2 範例資料庫的 Production.Document 或 HumanResources.JobCandidate 資料表。

A. 建立全文檢索索引但不執行完整母體擴展

下列範例會針對 AdventureWorks2008R2 範例資料庫的 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. 針對資料表執行完整母體擴展

下列範例會針對 AdventureWorks2008R2 範例資料庫的 Production.Document 資料表執行完整母體擴展。

ALTER FULLTEXT INDEX ON Production.Document
   START FULL POPULATION;

C. 使用手動變更追蹤來建立全文檢索索引

下列範例會針對 AdventureWorks2008R2 範例資料庫的 HumanResources.JobCandidate 資料表建立使用變更追蹤搭配手動母體擴展的全文檢索索引。

USE AdventureWorks2008R2;
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. 執行手動母體擴展

下列範例會針對 AdventureWorks2008R2 範例資料庫之 HumanResources.JobCandidate 資料表的變更追蹤全文檢索索引執行手動母體擴展。

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

E. 將全文檢索索引更改成使用自動變更追蹤

下列範例會將 AdventureWorks2008R2 範例資料庫之 HumanResources.JobCandidate 資料表的全文檢索索引變更成使用變更追蹤搭配自動母體擴展。

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