Оновлення запитів повільніше після ввімкнення повнотекстового індексу SQL Server


10

У мене є веб-сайт asp.net з багатьма запитами на вставлення, оновлення та видалення, що працюють проти моєї бази даних.

Кілька днів тому я створив повнотекстовий покажчик на двох стовпцях однієї з таблиць. Після цього я зрозумів, що коли веб-сайт виконує запити на оновлення на цій таблиці, використання пам'яті та диска в процесі SQL Server скаче, і оновлення відбувається повільніше. Перед створенням повнотекстового індексу запити виконувались без проблем щодо продуктивності.

Я також зрозумів, що запити на оновлення, які раніше були дуже простими, тепер є складними, оскільки зараз у плані виконання є такі речі, як оновлення індексу Full Text. Це частина нового плану виконання, який ускладнився після включення Повного тексту:

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

За декілька годин, коли я оновлюю вміст сайту, я запускав 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.