0

У меня есть полнотекстовый индекс столбца в таблице, которая содержит такие данные:Полнотекстовый поиск индекса имеет большое количество чтения страниц

searchColumn 
90210 Brooks Diana Miami FL [email protected] 5612233395 

колонна представляет собой совокупность Zip, фамилия, имя, имя, город, штат, адрес электронной почты и номер телефона.

Я использую этот столбец для поиска клиента на основе любой из этой возможной информации.

Проблема, о которой я беспокоюсь, связана с большим количеством чтений, возникающих при выполнении запроса в этом столбце. Запрос я использую:

declare @searchTerm varchar(100) = ' "FL" AND "90210*" AND "Diana*" AND "Brooks*" ' 

select * 
from CustomerInformation c 
where contains(c.searchColumn, @searchTerm) 

Теперь, когда работает Profiler я могу видеть, что этот поиск имеет около 50,000 страницу читает возвращать одну строку, в отличие при использовании другого подхода с использованием регулярных индексов и нескольких переменных , измельчали ​​как @firstName, @LastName, как показано ниже:

WHERE C.FirstName like coalesce(@FirstName + '%' , C.FirstName) 
    AND C.LastName like coalesce(@LastName + '%' , C.LastName) 
    etc. 

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

ответ

1

У меня есть пара мыслей об этом. Сначала Select * будет генерировать большое количество страниц, потому что он должен вытащить все столбцы, которые могут индексироваться или не индексироваться. Когда вы вытаскиваете каждый столбец, скорее всего, он не будет использовать лучший индексный план.

Что касается предложений Where, при использовании @searchTerm и значения «FL» AND «90210 *» AND «Diana *» AND «Brooks *», он должен проверять данные несколько раз каждый раз, когда он запускается , Подумайте, как бы вы искали эту информацию, если бы вам пришлось это делать. Вы посмотрите на лист бумаги с информацией об этом и посмотрите, содержит ли столбец поиска FL. Теперь он содержит FL и 90210 *. Теперь он содержит оба из них плюс Диана ... и т. Д.

Вы можете видеть, почему он будет продолжать возвращаться на страницу, чтобы читать снова и снова. Второй запрос должен смотреть только на 2 столбца, узко определенные.

Если вы хотите получить дополнительную информацию об этом, я предлагаю класс от Brent Ozar, который является бесплатным прямо сейчас. How to think like the SQL Server Engine

Я надеюсь, что это поможет.

+0

Хорошо, я получаю комментарий о '*', на самом деле я вытягиваю только те столбцы, которые мне нужны, я просто ставил '*' не слишком сложный вопрос, потому что есть много столбцов. Кроме того, я думаю, было бы странно, если бы движок заходил и читал страницу каждый раз, когда ему приходилось проверять его на состояние, если оно уже было на странице в первый раз. Но я проверю учебники Brent, спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^