2010-06-21 2 views
0

Я заметил, что первый оператор sql с LIKE на большом столе работает очень медленно (около 20 минут), но каждый последующий очень быстрый (несколько секунд), даже , если строки (первая функция «%», вторая «su_mit%»)sql server 2008 LIKE performance

Сохраняет ли sql-сервер результаты сканирования таблицы для «подобной инструкции» в кеше? Доступен ли доступный кэш для всех клиентов?
Срок действия «кеша» истекает?
Если полный текстовый индекс доступен для того же столбца, где применяется и заполняется LIKE, влияет ли «кеш» на полную скорость текста?
Кто-нибудь знает документ, объясняющий проблему?
Приветствия
Грег

ответ

1

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

Для запросов с не ведущим джокера (как в ваших примерах выше), вы могли бы уменьшить его сканирования индекса, если столбец вы запрашивая индексируется с нормальным индексом ...

Полный текст индексы не используется оператором LIKE, если у вас есть полнотекстовый индекс в столбце, вероятно, это хорошая идея, чтобы перейти от запроса LIKE к полнотекстовому запросу ... См. http://msdn.microsoft.com/en-us/library/ms142559.aspx

+0

Индекс, к сожалению, не является вариантом - строка может быть в любом месте поля, а размер слишком велик для индексации. если это страницы в памяти, поэтому я думаю, что это не так надежно, так как производительность - памяти в любое время ... – Greg

+0

Хорошо, звучит как полнотекстовое индексирование, будет вашим лучшим вариантом ... ... и да, страницы в буферном кеше могут быть удалены в любой момент каким-то другим запросом (если у вас недостаточно ram, чтобы поместить всю БД в память :)). – KristoferA

0

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

Я не эксперт по SQL-серверу, поэтому, возможно, кто-то еще может добавить в него дополнительные сведения, но при использовании LIKE вы в основном удаляете возможность использования баз данных любыми индексами. Если вы хотите использовать полный текстовый индекс, вам нужно использовать одну из конкретных команд запроса полного текста FREETEXT, FREETEXTTABLE, CONTAINS и CONTAINSTABLE.