この質問で 彼は私と同じ問題を抱えています。私は次のようなものが必要です:
select * from blablabla
where product
like '%rock%' or
like '%paper%' or
like '%scisor%' or
like '%car%' or
like '%pasta%'
これは醜く、インデックスを使用していません。この場合、これは実際にこれを行う唯一の方法です(文字列内の複数の単語を選択するため)、またはFULLTEXTを使用する必要がありますか?
私が理解しているように、フルテキストでは、文字列内の複数の単語を選択できます。
フルテキストインデックスは通常、特効薬ではなく、追加のメンテナンス、ディスク容量、およびクエリパターンへのかなり煩わしい変更が必要です。
大きなドキュメント(電子メールの本文、PDF、Wordのドキュメントなど)にインデックスを付ける必要が本当にない限り、それらはやりすぎです(正直に言って、SQL Serverからそのプロセスを完全に取り除きます。 Elasticsearchなどを使用します)。
ユースケースが小さい場合は、一般に計算カラムがより優れたアプローチです。
これは簡単なデモ設定です:
use tempdb
CREATE TABLE #fulltextindexesarestupid (Id INT PRIMARY KEY CLUSTERED, StopAbusingFeatures VARCHAR(100))
INSERT #fulltextindexesarestupid (Id)
SELECT TOP 1000000 ROW_NUMBER() OVER (ORDER BY (@@ROWCOUNT))
FROM sys.messages AS m
CROSS JOIN sys.messages AS m2
UPDATE #fulltextindexesarestupid
SET StopAbusingFeatures = CASE WHEN Id % 15 = 0 THEN 'Bad'
WHEN Id % 3 = 0 THEN 'Idea'
WHEN Id % 5 = 0 THEN 'Jeans'
END
ALTER TABLE #fulltextindexesarestupid
ADD LessBad AS CONVERT(BIT, CASE WHEN StopAbusingFeatures LIKE '%Bad%' THEN 1
WHEN StopAbusingFeatures LIKE '%Idea%' THEN 1
ELSE 0 END)
CREATE UNIQUE NONCLUSTERED INDEX ix_whatever ON #fulltextindexesarestupid (LessBad, Id)
非永続的な列にも基づいてクエリを実行すると、「インデックスを使用」する計画とすべてが得られます:)
SELECT COUNT(*)
FROM #fulltextindexesarestupid AS f
WHERE LessBad = 1