web-dev-qa-db-ja.com

「LIKE OR LIKE、OR LIKE、OR LIKE、OR =いいね」

この質問で 彼は私と同じ問題を抱えています。私は次のようなものが必要です:

select * from blablabla 
where product 
like '%rock%' or
like '%paper%' or
like '%scisor%' or
like '%car%' or
like '%pasta%' 

これは醜く、インデックスを使用していません。この場合、これは実際にこれを行う唯一の方法です(文字列内の複数の単語を選択するため)、またはFULLTEXTを使用する必要がありますか?

私が理解しているように、フルテキストでは、文字列内の複数の単語を選択できます。

この質問は全文についても話します

10
Racer SQL

フルテキストインデックスは通常、特効薬ではなく、追加のメンテナンス、ディスク容量、およびクエリパターンへのかなり煩わしい変更が必要です。

大きなドキュメント(電子メールの本文、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

NUTS

17
Erik Darling