SQL SELECT ... WHERE с REPLACE - беспокоюсь, что это неэффективно - PullRequest
4 голосов
/ 18 февраля 2010

В SQL Server 2005 у меня есть поиск продукта, который выглядит следующим образом:

select ProductID, Name, Email 
from Product
where Name = @Name

Меня попросили проигнорировать пару «специальных» символов в Product.Name, чтобы при поиске «Картошка» возвращались «По-таэ», а также «Картошка». Моя первая мысль - просто сделать это:

select ProductID, Name, Email 
from Product
where REPLACE(Name, '-', '') = @Name

... но, подумав, интересно, убиваю ли я производительность, выполняя функцию для КАЖДОГО возможного результата. Есть ли в SQL какая-то магия оптимизации, которая помогает быстро делать подобные вещи? Можете ли вы придумать что-нибудь проще, что я мог бы попробовать с моими требованиями?

Ответы [ 3 ]

5 голосов
/ 18 февраля 2010

Больше стандартов: вы можете добавить новый столбец, например, searchable_name, предварительно рассчитать результаты REPLACE (и любых других настроек, например, SOUNDEX) на INSERT/UPDATE и сохранить их в новом столбце. затем выполните поиск по этому столбцу.

Меньше основанных на стандартах: во многих РСУБД имеется функция, позволяющая создать INDEX с помощью функции; это часто называют функциональным индексом. Ваша ситуация кажется вполне подходящей для такой функции.

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

5 голосов
/ 18 февраля 2010

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

select ProductID, Name, Email 
from Product
where REPLACE(Name, '-', '') = @Name
      And Name Like Left(@Name, 1) + '%'

Если столбец имени проиндексирован, вы, вероятно, получите поиск по индексувместо сканирования.Недостатком является то, что вы не будете возвращать строки, в которых значение равно «-po-ta-to-es», поскольку первый символ не совпадает.

0 голосов
/ 18 февраля 2010

Можете ли вы добавить в таблицу продуктов поле с доступной для поиска версией названия продукта, в которой уже удалены специальные символы? Затем вы можете выполнить «замену» только один раз для каждой записи и выполнить эффективный поиск по новому полю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...