適用於:SQL Server
Azure SQL 資料庫
Azure SQL 受控執行個體
建立和維護全文索引包括使用稱為「填入」(Population) 的處理程序 (也稱為「抓取」(Crawl)) 來填入索引。
人口類型
全文檢索索引支援下列填入類型:
- 完整人口
- 以變更追蹤為基礎的自動或手動母體擴展
- 以時間戳記為基礎的漸增人口
全體人口
在完整填充期間,系統會為資料表或索引視圖的所有資料列建立索引項目。 全文索引的完整填充會為基礎資料表或已索引檢視表的所有資料列建立索引項目。
根據預設,SQL Server 會在建立新的全文索引時立即將其完整填充。
- 一方面,完整人口可能會消耗大量資源。 因此,在尖峰期間建立全文檢索索引時,最佳作法通常是延遲完整母體擴展直到離峰時間為止,尤其是全文檢索索引的基底資料表很龐大時。
- 另一方面,此索引所屬的全文檢索目錄在其所有全文檢索索引填入之前是無法使用的。
若要建立全文檢索索引,但不立即填入,請在 CHANGE_TRACKING OFF, NO POPULATION 陳述式中指定 CREATE FULLTEXT INDEX 子句。 如果您指定 CHANGE_TRACKING MANUAL,則全文檢索引擎在您使用 ALTER FULLTEXT INDEX 或 START FULL POPULATION 子句來執行 START INCREMENTAL POPULATION 陳述式之前,並不會填入新的全文檢索索引。
範例 - 建立全文檢索索引但不執行完整母體擴展
下列範例會針對 Production.Document 範例資料庫的 AdventureWorks 資料表建立全文檢索索引。 這個範例會使用 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
範例 - 執行資料表的完整母體擴展
下列範例會針對 Production.Document 範例資料庫的 AdventureWorks 資料表執行完整母體擴展。
ALTER FULLTEXT INDEX ON Production.Document
START FULL POPULATION;
基於變更追蹤的人口
在初始完整填入完成後,您可以選擇性地使用變更追蹤來維護全文檢索索引。 由於 SQL Server 維護一個資料表來追蹤自上次更新以來對基底資料表所做的變更,因此存在與變更追蹤相關聯的少量負擔。 使用變更追蹤時,SQL Server 會在基底資料表或索引檢視表中維護已由更新、刪除或插入作業所修改的資料列記錄。 透過 WRITETEXT 和 UPDATETEXT 進行的資料變更不會反映在全文檢索索引中,且變更追蹤也不會偵測到這些變更。
注意
如果資料表包含 timestamp 欄,您可以使用增量填充而非變更追蹤。
在建立索引期間啟用變更追蹤時,SQL Server 會在建立新的全文檢索索引後立即填充。 之後,系統會追蹤並傳播變更至全文檢索索引。
啟用變更追蹤
有兩種類型的變更追蹤:
- 自動 (
CHANGE_TRACKING AUTO選項)。 自動變更追蹤是預設的行為。 - 手動 (
CHANGE_TRACKING MANUAL選項)。
變更追蹤的類型會決定全文索引的填充方式,如下所示:
自動填充
根據預設,或者如果您指定
CHANGE_TRACKING AUTO,全文檢索引擎就會針對全文索引使用自動填充。 初始完整資料填入完成後,當基底資料表中的資料被修改時,系統就會追蹤變更,所追蹤的變更會自動傳播。 不過,全文檢索索引會在背景更新,所以傳播的變更可能不會立即反映在索引中。啟動變更追蹤並自動填入
CREATE FULLTEXT INDEX ...WITH CHANGE_TRACKING AUTO
ALTER FULLTEXT INDEX ...設定變更追蹤 自動
範例 - 將全文檢索索引更改成使用自動變更追蹤
下列範例會將範例資料庫HumanResources.JobCandidate資料表的全文索引更改為使用變更追蹤並自動填充。USE AdventureWorks; GO ALTER FULLTEXT INDEX ON HumanResources.JobCandidate SET CHANGE_TRACKING AUTO; GO手動填充
如果您指定了 CHANGE_TRACKING MANUAL,全文引擎將會針對全文索引使用手動填充。 初始完整填入人口完成之後,當基礎資料表中的資料被修改時,系統會追蹤變更。 然而,它們不會被傳播至全文索引,直到您執行 ALTER FULLTEXT INDEX ... START UPDATE POPULATION 陳述式。 您可以使用 SQL Server Agent 來定期呼叫這個 Transact-SQL 陳述式。
若要使用手動填入來開始追蹤變更
CREATE FULLTEXT INDEX ...使用 "手動變更追蹤"
ALTER FULLTEXT INDEX ...設定變更追蹤為手動
範例 - 使用手動變更追蹤來建立全文檢索索引
下列範例會針對HumanResources.JobCandidate範例資料庫的AdventureWorks資料表建立使用變更追蹤搭配手動母體擴展的全文檢索索引。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範例 - 執行手動填充
下列範例會針對HumanResources.JobCandidate樣本資料庫的AdventureWorks資料表的變更追蹤全文檢索索引執行手動填入。USE AdventureWorks; GO ALTER FULLTEXT INDEX ON HumanResources.JobCandidate START UPDATE POPULATION; GO
停用變更追蹤
建立全文索引 ...變更追蹤關閉
ALTER FULLTEXT INDEX ...SET CHANGE_TRACKING OFF
基於時間戳記的增量人口
遞增式填充是一種手動填充全文索引的替代機制。 如果資料表遇到大量插入作業,使用累加母體擴展可能會比使用手動母體擴展更有效率。
您可以針對將 CHANGE_TRACKING 設定為 MANUAL 或 OFF 的全文索引執行增量填充。
累加母體擴展的要求是,索引資料表必須包含 timestamp 資料類型資料行。 如果沒有 timestamp 資料行,就無法執行增量更新。
SQL Server 會使用 timestamp 資料行來識別自上次填充起已變更的資料列。 然後,累加母體擴展會針對在上一次母體擴展之後或進行時加入、刪除或修改的資料列,更新全文檢索索引。 在集合結束時,全文檢索引擎會記錄新的 timestamp 值。 這個值就是「SQL 收集程式」所找到的最大 timestamp 值。 此值會在下次增量資料填充啟動時使用。
在某些情況下,增量統計要求會導致完整統計。
- 若對不含 timestamp 欄位的資料表發出增量填充請求,結果會進行完整填充作業。
- 如果全文索引的初始填充是增量填充,這會為所有資料列建立索引,相當於完整填充。
- 如果自上次人口增量以來,影響資料表全文索引的任何中繼資料已經更改,增量人口增量請求將作為完整人口增量進行實施。 這包括因更改任何欄位、索引或全文索引定義而導致的後設資料變更。
執行累加母體擴展
若要執行累加母體擴展,請使用 ALTER FULLTEXT INDEX 子句來執行 START INCREMENTAL POPULATION 陳述式。
建立或變更增量填充的排程
在 Management Studio 中,於 [物件總管] 中展開伺服器。
展開 資料庫,然後展開包含全文檢索索引的資料庫。
展開 資料表。
以滑鼠右鍵按一下已定義全文檢索索引的資料表、選取 [全文檢索索引],然後按一下 [全文檢索索引] 內容功能表上的 [屬性]。 這樣就會開啟 [全文檢索索引屬性] 對話方塊。
重要
如果基底資料表或檢視表未包含 timestamp 資料類型的資料行,則無法執行累加母體擴展。
在 [選取頁面] 窗格中,選取 [排程]。
您可以使用這個頁面來建立或管理 SQL Server Agent 作業的排程,以便針對全文檢索索引的基底資料表或索引檢視表啟動累加資料表母體擴展。
選項如下:
若要建立新的排程,請按一下 [新增]。
這樣就會開啟 [新增全文檢索索引資料表排程] 對話方塊,可讓您建立排程。 若要儲存排程,請按一下 [確定]。
重要
在您結束 [全文檢索索引屬性] 對話方塊之後,SQL Server Agent 作業 (針對 資料庫名稱.資料表名稱 啟動累加資料表填充) 便會與新的排程相關聯。 如果您針對相同的全文檢索索引建立多個排程,它們都會使用相同的作業。
若要變更現有排程,請選取現有排程,然後按一下 [編輯]。
這樣就會開啟 [新增全文檢索索引資料表排程] 對話方塊,可讓您修改排程。
注意
如需修改 SQL Server Agent 作業的資訊,請參閱修改作業。
若要移除現有排程,請選取現有排程,然後按一下 [刪除]。
選取 [確定]。
排除全文填充(抓取)中的錯誤問題
搜耙發生錯誤時,「全文檢索搜尋」搜耙記錄功能會建立並維護搜耙記錄檔,此記錄檔是一個純文字檔。 每個爬網記錄檔都對應至特定的全文檔案目錄。 所指定執行個體 (在此範例中為預設執行個體) 的編目記錄檔預設位於 %ProgramFiles%\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\LOG 資料夾中。
網頁爬蟲記錄檔會依循以下命名規則:
SQLFT<DatabaseID><FullTextCatalogID>.LOG[<n>]
以下是爬網記錄檔名稱的變動部分。
- < DatabaseID> - 資料庫的識別碼。 < dbid> 是開頭為零的五位數數字。
- < FullTextCatalogID> - 全文檢索目錄識別碼。 < catid> 是開頭為零的五位數數字。
- < n> - 是一個整數,用於表示存在一個或多個相同全文目錄的編目記錄檔。
例如,SQLFT0000500008.2 是指資料庫識別碼 = 5 而且全文檢索目錄識別碼 = 8 之資料庫的編目記錄檔。 檔案名稱結尾的數字 2 表示此資料庫/目錄對有兩個抓取記錄檔。
另請參閱
sys.dm_fts_index_population(Transact-SQL)
全文檢索快速入門
建立及管理全文檢索索引
建立全文索引(Transact-SQL)
ALTER FULLTEXT INDEX (Transact-SQL)