Ответ sp_BlitzErik имеет много положительных моментов, но я не думаю, что вам не следует использовать полнотекстовый поиск. Полнотекстовый поиск не для того, чтобы делать то, что вы думаете. Это не для поиска по нескольким полям. Это там, чтобы векторизовать содержание слов и использовать словари, заглушки, лексеры, газеты, исключение стоп-слов и множество других трюков, ни один из которых не применим. Или еще не было показано, чтобы применить.
Я также не согласен с решением, хотя я не уверен, как сделать это лучше в SQL Server. Давайте воссоздадим его данные для PostgreSQL - в PostgreSQL его создавать намного чище.
CREATE TABLE fulltextindexesarestupid
AS
SELECT
id,
CASE WHEN Id % 15 = 0 THEN 'Bad'
WHEN Id % 3 = 0 THEN 'Idea'
WHEN Id % 5 = 0 THEN 'Jeans'
END AS StopAbusingFeatures
FROM generate_series(1,1000000) AS id;
Теперь, что вы хотите, это тип enum,
CREATE TYPE foo AS ENUM ('Bad', 'Idea', 'Jeans');
ALTER TABLE fulltextindexesarestupid
ALTER StopAbusingFeatures
SET DATA TYPE foo
USING StopAbusingFeatures::foo;
Теперь вы свернули строки в целочисленные представления. Но даже лучше, вы можете запросить их, как раньше.
SELECT *
FROM fulltextindexesarestupid
WHERE StopAbusingFeatures = 'Bad';
Это имеет эффект.
- скрывает тот факт, что вы категории перечислимого типа. Эта сложность заключена в типе и скрыта от пользователя.
- это также помещает обслуживание в те категории на типе.
- это стандартизировано.
- это не увеличивает размер строки.
Без этих преимуществ вы, по сути, просто пытаетесь оптимизировать сравнение строк. Но, увы, я даже не уверен, как sp_BlitzErik получает ответ, учитывая код в предложении,
like '%rock%' or
like '%paper%' or
like '%scisor%' or
like '%car%' or
like '%pasta%'
Вы можете свернуть токены до целых чисел, используя enum, или метод ручного прокрутки, предложенный sp_BlitzErik, но если вы можете сделать свертывание, почему вы тоже делаете unanchored-like? То есть, если вы знаете, что «% pasta%» является символом «макароны», почему у вас есть %
обе стороны от него? Без «%» это проверка на равенство, и она должна работать довольно быстро даже в виде текста.