Мне нужно реализовать поиск по шаблону, используя% на обоих концах, как я могу улучшить производительность? - PullRequest
0 голосов
/ 19 августа 2011

Я буду реализовывать это на стороне SQL, поэтому я получу что-то вроде

where company.name like '%:parameter%'

Я читал ранее, что это сделает невозможным использование БД индекса company.name.

Тогда у меня возникнет вопрос: какие еще варианты у меня есть, чтобы минимизировать снижение производительности, которое это приведет к поиску? Обратите внимание, что это требования клиента, поэтому у меня нет возможности не реализовывать (хотя я объяснил им последствия для производительности).

Приложение использует Sybase SE 12.5.3 (на основе драйвера, используемого в DBArtisan 8.5.5)

Ответы [ 3 ]

2 голосов
/ 19 августа 2011

Я не знаю Sybase, но вы можете сделать что-то вроде следующего:

  • Создайте второе поле, обратное названию компании.
  • Добавить индекс для этого нового поля
  • Используйте следующее выражение where

    WHERE company_name как ': параметр%' или reverse_name как Reverse (параметр) + '% '

Надеюсь, это укажет вам правильное направление

0 голосов
/ 19 августа 2011

Ты совершенно прав, что это убийца производительности.

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

Другими словами, допустим, у вас в главной таблице две компании: ICBM и Microsloth.

Что вы можете сделать, это создать другую таблицу, содержащую следующее:

TextSegment    varchar(?) indexed
ActualCompany  varchar(?)

и заполните его следующим образом:

TextSegment  ActualCompany
-----------  -------------
ICBM         ICBM
CBM          ICBM
BM           ICBM
M            ICBM
Microsloth   Microsloth
icrosloth    Microsloth
crosloth     Microsloth
rosloth      Microsloth
osloth       Microsloth
sloth        Microsloth
loth         Microsloth
oth          Microsloth
th           Microsloth
h            Microsloth

Затем, когда вы ищете компании, подобные %slo%, вы можете использовать:

select ActualCompany from LookupTable where TextSegment like 'slo%'

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

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

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

0 голосов
/ 19 августа 2011

Существует вероятность того, что индекс потенциально может быть использован, но это крайне маловероятно (см. этот комментарий ). Если возможно, я бы сделал запрос на основе другого индексированного поля и затем выбрал бы результаты, чтобы, по крайней мере, избежать полного сканирования таблицы.

...