Оптимизация поиска по строкам
От: Keith  
Дата: 18.10.10 17:06
Оценка:
В таблице примерно 1 млн строк типа nvarchar(410).

   select * 
   from Person
   where Address like '%мойзапрос%'


План выполнения:

 Parallelism (Gather Streams)   5%
 Table Scan                     95%

Как ускорить процесс?
Поможет ли полнотекстовый индекс и какого объема он получится?

(проект на хостинге — БД докупать не хочется)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Оптимизация поиска по строкам
От: Didi  
Дата: 19.10.10 06:09
Оценка: 3 (1)
Здравствуйте, Keith, Вы писали:

K>В таблице примерно 1 млн строк типа nvarchar(410).


K>
K>   select * 
K>   from Person
K>   where Address like '%мойзапрос%'
K>


Полнотекстовый индекс тебе поможет, его объем раза в три превысит суммарный объем всех строк в поле адрес.
Без него единственно что можно сделать — вынести поле адрес в отдельную таблицу
(можно заполнять отдельную таблицу в триггере, а в персон адрес оставить)
Если есть особенности поиска, часть информации можно просто выкидывать (например ул, пер, проспект и т.д.),
в идеале при приведении к "нормальному" виду запрос можно будет перевести из like '%мойзапрос%' к like 'мойзапрос%'
возможно по одной персоне хранить несколько строчек из таблицы адрес
тогда твой запрос будет выглядеть следующим образом:
   select * 
   from Person
   JOIN Address ON Address.Id=Person.Id
   WHERE Address.Address like '%мойзапрос%' -- в идеале like 'мойзапрос%'

Ну или IN() при связи один ко многим
Re: Оптимизация поиска по строкам
От: MasterZiv СССР  
Дата: 19.10.10 08:36
Оценка: 1 (1)
On 18.10.2010 21:06, Keith wrote:
> select *
> from Person
> where Addresslike '%мойзапрос%'

Либо пиши
where Addresslike 'мойзапрос%'

либо используй полнотекстовые индексы.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Оптимизация поиска по строкам
От: Keith  
Дата: 19.10.10 17:41
Оценка:
Здравствуйте, Didi, Вы писали:

D>возможно по одной персоне хранить несколько строчек из таблицы адрес

D>тогда твой запрос будет выглядеть следующим образом:
D>
D>   select * 
D>   from Person
D>   JOIN Address ON Address.Id=Person.Id
D>   WHERE Address.Address like '%мойзапрос%' -- в идеале like 'мойзапрос%'
D>

D>Ну или IN() при связи один ко многим

Т.е. если выносить строку в отдельную таблицу, то нужно делать дополнительное поле Id и по нему как раз и join'ить?
Спасибо, попробую.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Оптимизация поиска по строкам
От: Keith  
Дата: 19.10.10 17:56
Оценка:
Здравствуйте, Didi, Вы писали:

D>Без него единственно что можно сделать — вынести поле адрес в отдельную таблицу


Я правильно понимаю, что само по себе вынесение в отдельную таблицу столбца по которому идет поиск должно дать какое-то преимущество? Я только что оставил в таблице только два столбца — id и address и попробовал поискать — получилось то же время, что и без вынесения. Что я делаю не правильно?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Оптимизация поиска по строкам
От: Didi  
Дата: 20.10.10 06:40
Оценка: 2 (1)
K> Я правильно понимаю, что само по себе вынесение в отдельную таблицу столбца по которому идет поиск должно дать какое-то преимущество? Я только что оставил в таблице только два столбца — id и address и попробовал поискать — получилось то же время, что и без вынесения. Что я делаю не правильно?

Все ты сделал правильно (надеюсь по id основной таблицы индекс есть), просто было сказано, что строк в "персон" достаточно много и возможно она не помещалась полностью в оперативную память, тогда более узкая таблица в память влезет обязательно — если нет разницы, значит они обе полностью помещаются в оперативке, при этом разницы практически нет.
У тебя два выхода, изменить хранение в вспомогательной таблицы адреса, так, чтобы можно было искать по like 'мой запрос%' (и создать индекс по этому полю), я не знаю что у тебя там хранится, обычно операторы вносят "ул. Красноармейская", а найти хотят все по Красноар% — соответственно тебе нужно очищать при сохранении строки от всякого мусора (первозданная строка у тебя сохранена в таблице "персон")
Второй вариант использовать полнотекстовый поиск, правда он не совсем соответствует like'%мой_запрос%' а скорее like'% мой_запрос%' т.е. ищет только с начала слова. Поэтому при поиске "армейск%" улица Красноармейская найдена не будет.

Успехов!
Re[4]: Оптимизация поиска по строкам
От: Keith  
Дата: 20.10.10 19:13
Оценка:
Здравствуйте, Didi, Вы писали:

D>У тебя два выхода, изменить хранение в вспомогательной таблицы адреса, так, чтобы можно было искать по like 'мой запрос%' (и создать индекс по этому полю), я не знаю что у тебя там хранится, обычно операторы вносят "ул. Красноармейская", а найти хотят все по Красноар% — соответственно тебе нужно очищать при сохранении строки от всякого мусора (первозданная строка у тебя сохранена в таблице "персон")

К сожалению, изменить все существующие адреса нет возможности и пользователи хотят искать по любому фрагменту, поэтому 'мой_запрос%' не подходит.

D>Второй вариант использовать полнотекстовый поиск, правда он не совсем соответствует like'%мой_запрос%' а скорее like'% мой_запрос%' т.е. ищет только с начала слова. Поэтому при поиске "армейск%" улица Красноармейская найдена не будет.


А при поиске "%армейск%" хотя бы будет найдено?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Оптимизация поиска по строкам
От: Aikin Беларусь kavaleu.ru
Дата: 21.10.10 06:58
Оценка:
Здравствуйте, Keith, Вы писали:

K> Как ускорить процесс?

K> Поможет ли полнотекстовый индекс и какого объема он получится?

K> (проект на хостинге — БД докупать не хочется)
Если полнотекстовый поиск не поможет, то можно посмотреть в сторону Lucene. Вот только прикрутить его будет много сложнее чем добавить полнотекстовый индекс.

СУВ, Aikin
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re[2]: Оптимизация поиска по строкам
От: cadet354 Россия
Дата: 21.10.10 07:58
Оценка:
Здравствуйте, Aikin, Вы писали:

A>Здравствуйте, Keith, Вы писали:


K>> Как ускорить процесс?

K>> Поможет ли полнотекстовый индекс и какого объема он получится?

K>> (проект на хостинге — БД докупать не хочется)
A>Если полнотекстовый поиск не поможет, то можно посмотреть в сторону Lucene. Вот только прикрутить его будет много сложнее чем добавить полнотекстовый индекс.
а чем Lucene лучше полнотекстового поиска MSSQL ?
A>СУВ, Aikin
... << RSDN@Home 1.2.0 alpha 4 rev. 1270>>
Re[3]: Оптимизация поиска по строкам
От: Aikin Беларусь kavaleu.ru
Дата: 21.10.10 08:40
Оценка:
Здравствуйте, cadet354, Вы писали:

A>>Если полнотекстовый поиск не поможет, то можно посмотреть в сторону Lucene. Вот только прикрутить его будет много сложнее чем добавить полнотекстовый индекс.

C>а чем Lucene лучше полнотекстового поиска MSSQL ?
Я не знаю что из себя представляет полнотекстовый поиск в MSSQL, но, судя по сообщению
Автор: Didi
Дата: 20.10.10
, может он не так уж и много. В отличии от того же Lucene.
Вполне возможно, что это сообщение скорее всего далеко от действительности (ну не может MS так лопухнуться ), но опровержения до сих пор не было

Я же просто указал альтернативу.
Кста, нашел статью про разные поиски: http://habrahabr.ru/blogs/webdev/30594/

СУВ, Aikin
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re[4]: Оптимизация поиска по строкам
От: cadet354 Россия
Дата: 21.10.10 10:00
Оценка: 1 (1)
Здравствуйте, Aikin, Вы писали:

A>Здравствуйте, cadet354, Вы писали:


A>>>Если полнотекстовый поиск не поможет, то можно посмотреть в сторону Lucene. Вот только прикрутить его будет много сложнее чем добавить полнотекстовый индекс.

C>>а чем Lucene лучше полнотекстового поиска MSSQL ?
A>Я не знаю что из себя представляет полнотекстовый поиск в MSSQL, но, судя по сообщению
Автор: Didi
Дата: 20.10.10
, может он не так уж и много. В отличии от того же Lucene.

A>Вполне возможно, что это сообщение скорее всего далеко от действительности (ну не может MS так лопухнуться ), но опровержения до сих пор не было
со стёмингом в текущей версии действительно не фонтан, я например при тестировании наткнулся на то что словоформы от слова шторм не строяться. И свои не подложить
но в люске аналогичная проблема.
A>
судя по этой ветке: вопрос про разные полнотекстовые движки
Автор: ___Avatar___
Дата: 10.02.10
lucene не лучше, там даже синонимов нет (в MS есть)
A>Я же просто указал альтернативу.
понятно, интересно мнение тех кто поробывал и то и другое с учетом поиска по русскому тексту.
A>Кста, нашел статью про разные поиски: http://habrahabr.ru/blogs/webdev/30594/

A>СУВ, Aikin
... << RSDN@Home 1.2.0 alpha 4 rev. 1270>>
Re[4]: Оптимизация поиска по строкам
От: Didi  
Дата: 22.10.10 12:05
Оценка:
A>Я не знаю что из себя представляет полнотекстовый поиск в MSSQL, но, судя по сообщению
Автор: Didi
Дата: 20.10.10
, может он не так уж и много. В отличии от того же Lucene.

A>Вполне возможно, что это сообщение скорее всего далеко от действительности (ну не может MS так лопухнуться ), но опровержения до сих пор не было

Я так понимаю, что это был кивок в мою сторону.
Давайте вместе почитаем короткое определение Полнотекстовый поиск
кто не любит читать, одно предложение: полнотекстовый индекс — словарь, в котором перечислены все слова
Т.е. по определению с середины слова полнотекстовый индекс искать не может (точнее может но это уже не индекс, потому как нужно делать полный перебор всех слов в словаре, а потом уже находить места где они встречались, думаю по скорости это не сильно отличается от перебора записей всей таблицы), да теоретически можно было бы построить словарь букв (или буквосочетаний), но на самом деле это никому не нужно, попробуйте использовать поисковики Google, Yandex и пр., вы находили когда-нибудь тексты с середины заданного слова?
др. словами несмотря на глубокие знания и законов Ома и Кирхгофа, как течет керосин по проводам к лампочке мы совсем не понимаем?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.