Обновление запросов происходит медленнее после включения полнотекстового индекса SQL Server


10

У меня есть веб-сайт asp.net со множеством запросов на вставку, обновление и удаление, работающих с моей базой данных.

Несколько дней назад я создал полнотекстовый индекс по двум столбцам одной из таблиц. После этого я понял, что, когда веб-сайт выполняет запросы на обновление этой таблицы, использование памяти и диска процесса SQL Server происходит скачкообразно, а обновления происходят медленнее. Запросы выполнялись без проблем с производительностью до создания полнотекстового индекса.

Я также понял, что запросы на обновление, которые раньше были очень простыми, теперь сложны, поскольку в плане выполнения теперь есть такие вещи, как обновление полнотекстового индекса. Это часть нового плана выполнения, который усложнился после включения полного текста:

введите описание изображения здесь

Через несколько часов, когда я обновляю содержимое сайта, я запустил 5000 запросов на обновление, и я думаю, что процесс полнотекстовой индексации выполняется каждый раз для каждой строки.

Следует ли отключить полнотекстовое сканирование в начале обновления строк, а затем снова включить его (как в этом связанном вопросе )?

Могу ли я сказать SQL Server прекратить полнотекстовое индексирование на 5 минут, а затем начать индексирование новых данных?

Есть ли лучшая альтернатива? Я использую SQL Server 2012.

Ответы:


2

В моем случае мне пришлось изменить неэффективный оператор UPDATE:

Перед:

UPDATE Customer 
SET Rating = 'Not Rated'
WHERE ...

После:

UPDATE Customer
SET Rating = 'Not Rated'
WHERE ...
AND Rating <> 'Not Rated' -- THIS LINE WAS INSERTED

Это улучшило производительность с 4 минут до 5 секунд. Проблема заключалась в том, что я использовал для обновления всех строк, даже если они уже имели значение, которое я хотел назначить.


1

Если вы остановите его (отключите), индекс не будет доступен для запросов, использующих его.

Однако вы можете установить отслеживание изменений на ручной:

--disable automatic change tracking
ALTER FULLTEXT INDEX ON schema.table SET CHANGE_TRACKING MANUAL
GO

--run the update statement here

--re-enable automatical change tracking after updating it to reflect the recent changes
ALTER FULLTEXT INDEX schema.table START UPDATE POPULATION
GO
ALTER FULLTEXT INDEX ON schema.table SET CHANGE_TRACKING AUTO
GO

Вы можете проверить текущее значение с помощью этого запроса:

SELECT TOP(10) change_tracking_state_desc, * 
FROM sys.fulltext_indexes 
WHERE object_name(object_id) = '...';

Допустимые варианты: SET CHANGE_TRACKING {MANUAL | AUTO | OFF}

Указывает, будут ли изменения (обновления, удаления или вставки), внесенные в столбцы таблицы, на которые распространяется полнотекстовый индекс, распространяться SQL Server на полнотекстовый индекс. Данные изменяются WRITETEXTи UPDATETEXTне отражаются в полнотекстовом индексе и не отслеживаются при отслеживании изменений.

См. Документацию Microsoft для ALTER FULLTEXT INDEX (Transact-SQL) .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.