Ты совершенно прав, что это убийца производительности.
Один метод, который мы использовали в прошлом, - это хранить все возможные названия компаний в отдельной таблице, ссылаясь на основную таблицу. Это ваш классический компромисс между временем и пространством для оптимизации.
Другими словами, допустим, у вас в главной таблице две компании: 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%'
Это позволяет вам использовать индекс для этой таблицы более эффективно, чем с %...%
для другой таблицы.
Теперь, имейте в виду, что вам понадобятся триггеры на исходной таблице, чтобы обеспечить соответствие таблицы поиска. И это займет довольно много места (в зависимости от ваших данных), но я заметил одну вещь: мало кто жалуется на размер своих баз данных, большинство проблем связаны со скоростью.
Влияние времени на ведение отдельной таблицы обычно не так уж и плохо, поскольку большинство баз данных читаются гораздо чаще, чем записываются. Этот метод перемещает стоимость от выбора до вставки / обновления, где она может быть довольно хорошо амортизирована.