Параметр «Автоматическое создание статистики» приводит к зависанию поиска в поле TEXT по шаблону - PullRequest
3 голосов
/ 22 сентября 2011

У меня есть интересная проблема, возникающая в Microsoft SQL при поиске в поле TEXT.У меня есть таблица с двумя полями, Id (int) и Memo (текст), заполненная сотнями тысяч строк данных.Теперь представьте запрос, например:

SELECT Id ИЗ таблицы, где Id = 1234

Довольно просто.Предположим, есть поле с идентификатором 1234, поэтому оно возвращает одну строку.Теперь давайте добавим еще одно условие к предложению WHERE.

SELECT Id ИЗ таблицы WHERE Id = 1234 И ЗАПИСЬ, КАК '% test%'

Запрос должен вытягиватьодну запись, а затем проверьте, существует ли слово «test» в поле «Memo».Однако, если данных достаточно, этот оператор будет зависать, как если бы он сначала искал поле Memo, а затем перекрестную ссылку на результаты с полем Id.

Хотя это то, что он, похоже, делает,Я только что обнаружил, что он на самом деле пытается создать статистику по полю Memo.Если я отключу «автоматическое создание статистики», запрос будет запущен мгновенно.

Итак, мой вопрос: как отключить автоматическое создание статистики, но только для одного запроса?Возможно, что-то вроде:

SET AUTO_CREATE_STATISTICS OFF

(я знаю, любой нормальный человек просто создал бы полнотекстовый индекс в этом поле и назвал бы его днем. ПричинаЯ не могу этого сделать, потому что в нашем центре обработки данных размещается приложение для более чем 4000 клиентов, использующих один и тот же дизайн базы данных. Не говоря уже о том, что эта проблема возникает в различных текстовых полях базы данных. Таким образом, это займет десятки тысячполнотекстовых индексов, если я пошел по этому пути. Не говоря уже о том, что добавление полнотекстового индекса добавило бы требования к хранилищу, изменениям в резервном копировании, изменениям процедуры аварийного восстановления, оформлению бумажной волокиты и т. д.) *

1 Ответ

3 голосов
/ 22 сентября 2011

Не думаю, что вы можете отключить это для каждого запроса.

Лучшее, что вы можете сделать, - это определить все потенциально проблемные столбцы, а затем CREATE STATISTICS на них, указав 0 ROWS или 0 PERCENT и NORECOMPUTE.

Если у вас есть окно обслуживания, вы можете запустить его, лучше всего запустить без этого 0 ROWS квалификатора, но все же оставить NORECOMPUTE на месте.

Вы могли бы также рассмотреть возможность включения AUTO_UPDATE_STATISTICS_ASYNC, чтобы они по-прежнему перестраивались автоматически, но это происходит в фоновом режиме, а не задерживает компиляцию текущего запроса, но это опция всей базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...