Заполнение полнотекстовых индексов
Область применения: SQL Server
База данных SQL Azure Управляемый экземпляр SQL Azure
Создание и обслуживание полнотекстового индекса включает процесс заполнения индекса (которое также называется сканированием).
Типы населения
Полнотекстовый индекс поддерживает следующие типы пополнения:
- полное население
- Автоматическое или ручное заполнение на основе отслеживания изменений.
- Инкрементная популяция на основе метки времени.
полное население
Во время полного заполнения индексные записи создаются для всех строк таблицы или индексированного представления. Процесс полного заполнения полнотекстового индекса включает создание индексных записей для всех строк базовой таблицы или индексированного представления.
По умолчанию 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 ... С АВТОМАТИЧЕСКИМ ОТСЛЕЖИВАНИЕМ ИЗМЕНЕНИЙ
ALTER FULLTEXT INDEX ... SET CHANGE_TRACKING AUTO
Пример переключения полнотекстового индекса на автоматическое отслеживание изменений
В следующем примере полнотекстовый индекс таблицыHumanResources.JobCandidate
в примере базы данныхAdventureWorks
изменяется на использование отслеживания изменений с автоматическим заполнением.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 можно использовать для периодического вызова инструкции Transact-SQL.
Запуск отслеживания изменений с заполнением вручную
СОЗДАТЬ ПОЛНЫЙ ТЕКСТОВЫЙ ИНДЕКС ... С РУЧНЫМ ОТСЛЕЖИВАНИЕМ ИЗМЕНЕНИЙ
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
Отключение отслеживания изменений
CREATE FULLTEXT INDEX ... С ОТСЛЕЖИВАНИЕМ ИЗМЕНЕНИЙ ВЫКЛючено
ALTER FULLTEXT INDEX ... установить отслеживание изменений в положение Выключено
Инкрементное население на основе временной метки.
Инкрементальное заполнение является альтернативным механизмом по сравнению с ручным заполнением полнотекстового индекса. Если в таблице выполняется большое количество операций вставки, использование инкрементального заполнения может быть более эффективным, чем заполнение вручную.
Можно запустить инкрементное заполнение для полнотекстового индекса, для которого параметр CHANGE_TRACKING установлен в значение MANUAL или OFF.
Требованием для постепенного пополнения данных является то, что проиндексированная таблица должна содержать столбец типа timestamp. Если столбца timestamp не существует, добавочное заполнение невозможно.
SQL Server использует столбец метки времени для идентификации строк, изменившихся с момента последней совокупности. Затем операция инкрементального заполнения обновляет полнотекстовый индекс для строк, которые были добавлены, удалены или изменены после последнего заполнения или во время его выполнения. По окончании обработки полнотекстовый движок сохраняет новое значение timestamp. Это значение — самое большое значение timestamp, которое удалось найти средству сбора данных SQL. Это значение будет использовано при старте следующего инкрементного заполнения.
В некоторых случаях запрос на инкрементное заполнение приводит к полной популяции.
- Попытка выполнить инкрементальное заполнение для таблицы, не содержащей столбец с timestamp, приведет к полному заполнению.
- Если первое заполнение полнотекстового индекса является добавочным, то производится индексирование всех строк, что является эквивалентом полного заполнения.
- Если за время, прошедшее с момента последнего заполнения, изменились какие-либо метаданные, влияющие на полнотекстовый индекс таблицы, то запросы добавочного заполнения реализуются как полное заполнение. Сюда относятся и изменения в метаданных, вызванные изменениями в определениях любых столбцов, индексов или полнотекстовых индексов.
Запуск добавочного заполнения
Для запуска инкрементального заполнения выполните оператор ALTER FULLTEXT INDEX
с использованием предложения START INCREMENTAL POPULATION
.
Создание или изменение расписания для добавочной совокупности
В обозревателе объектов среды Management Studio разверните сервер.
Разверните Базы данных, а затем разверните базу данных, содержащую полнотекстовый индекс.
Разверните Таблицы.
Правой кнопкой мыши щелкните таблицу, в которой определен полнотекстовый индекс, выберите Полнотекстовый индекс, затем в контекстном меню Полнотекстовый индекс выберите Свойства. Откроется диалоговое окно Свойства полнотекстового индекса .
Внимание
Если в базовой таблице или представлении нет столбца типа данных timestamp, то невозможно выполнить инкрементное заполнение.
На панели Выбор страницы выберите пункт Расписания.
Эта страница используется для создания расписания задания агента SQL Server, которое запускает добавочное заполнение базовой таблицы или индексированного представления полнотекстового индекса, а также для управления таким расписанием.
Существуют следующие варианты выбора.
Чтобы создать новое расписание, щелкните Создать.
Откроется диалоговое окно Создание расписания полнотекстового индексирования таблицы , в котором можно создать расписание. Чтобы сохранить расписание, нажмите кнопку ОК.
Внимание
Задание агента SQL Server (запуск добавочного заполнения таблицы на имя_базы_данных.имя_таблицы) связывается с новым расписанием после выхода из диалогового окна Свойства полнотекстового индекса. Если создается несколько расписаний для того же полнотекстового индекса, то все они используют одно и то же задание.
Чтобы изменить существующее расписание, выберите существующее расписание и щелкните Изменить.
Откроется диалоговое окно Создание расписания полнотекстового индексирования таблицы , в котором можно изменить расписание.
Примечание.
Сведения об изменении задания агента SQL Server см. в разделе Изменение задания.
Чтобы удалить существующее расписание, выберите существующее расписание и щелкните Удалить.
Нажмите ОК.
Устранение ошибок в полнотекстовой совокупности (обход)
При возникновении ошибки во время сканирования модуль протоколирования сканирования, входящий в механизм полнотекстового поиска, создает и обновляет журнал сканирования, хранящийся в текстовом файле. Каждый журнал сканирования соответствует конкретному полнотекстовому каталогу. По умолчанию журналы сканирования для конкретного экземпляра (в нашем случае — для экземпляра по умолчанию) хранятся в папке %ProgramFiles%\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\LOG
.
Файл журнала сканирования следует следующей схеме именования.
SQLFT<DatabaseID><FullTextCatalogID>.LOG[<n>]
Ниже перечислены переменные части в именах файла журнала сканирования.
- < DatabaseID> — идентификатор базы данных. < dbid> — это пять цифр с начальными нулями.
- < FullTextCatalogID> — идентификатор полнотекстового каталога. < catid> — это пять цифр с начальными нулями.
- < n> — целое число, указывающее, что существует один или несколько журналов обхода одного полнотекстового каталога.
Например, SQLFT0000500008.2
является файлом журнала сканирования для базы данных с идентификатором базы данных 5 и идентификатором полнотекстового каталога 8. Двойка в конце имени файла показывает, что этой паре базы данных и каталога соответствуют два файла журналов сканирования.
См. также
sys.dm_fts_index_population (Transact-SQL)
Начало работы с компонентом Full-Text Search
Создание и управление полнотекстовыми индексами
CREATE FULLTEXT INDEX (Transact-SQL)
ALTER FULLTEXT INDEX (Transact-SQL)