web-dev-qa-db-ja.com

LIKEクエリの最適化

以下の表があります。

create table Order_Details
(
 ID int not null primary key
,Order_ID int
,Order_Description nvarchar(40)
)

上記の表に27,500,000行を挿入しました。クエリの下で実行すると、6〜7秒かかります。

select ID,Order_ID, Order_Description 
from Order_Details
where Order_Description  like '%Football Size%'

IDOrder_Descriptionを含むOrder_IDに非クラスター化インデックスを適用しました。

クエリを最適化して結果をより速く取得する他の方法はありますか?

2
Sanket Makwana

構造を変更せずにクエリを最適化する方法はありません。このようなLIKEフィルターは、常にインデックスまたはテーブルスキャンになります。

Order_Descriptionただし、それはごくわずかな違いです。

注文の詳細に適切なスキーマを設計して、単一の文字列フィールドに格納するのではなく、ラインアイテムのプロパティで効率的に検索できるようにする方がはるかに良いでしょう。あなたが質問にあなたがその列で見つけると期待する種類のデータを追加すると、私たちはそこでより詳細にあなたを助けることができるかもしれません。

調査するもう1つのオプションは、ほとんどのSQL Serverエディションで利用できるフルテキストですが、ここでは最適な解決策ではないと思います。

3
David Spillett

問題は、その二重ワイルドカード'%string searches%' are SQL Serverでは遅い 特殊な trigrams がないため、ネイティブで検索します。

文字列検索列の先頭にインデックスがある場合でも、すべての行を読み取る必要があります。

CREATE NONCLUSTERED INDEX ix_displayname ON dbo.Users(DisplayName)

SELECT u.Id, u.Reputation, u.DisplayName
FROM dbo.Users AS u 
WHERE u.DisplayName LIKE '%Christopher%'

NUTS

1つの文字列のみを検索する場合(これは決して当てはまりません)、または既知の検索文字列のセットが限られている場合は、インデックス付きの計算列(複数可)が適しています。

ALTER TABLE dbo.Users ADD SearchString 
    AS CONVERT(BIT, CASE WHEN DisplayName LIKE '%Christopher%' THEN 1 ELSE 0 END)

CREATE INDEX ix_yourmom ON dbo.Users (SearchString)

それ以外の場合は、IDで検索できる順序で各項目を追跡するOrderLinesテーブルのように、テキストの検索を含まないデータを見つけるためのより良い方法を考え出す必要があります。

6
Erik Darling

SQL Serverの経験はありませんが、 [〜#〜] solr [〜#〜] をDBの横に配置して、テキスト検索を処理し、order_idとorder_details.idを返します。これは、DBでの以降のクエリに使用できます。

2
Gerard H. Pille

SQL Serverには 全文検索 が付属しています。コンテンツの途中で定期的に文字列を検索する場合は、全文検索機能を使用してください。

全文検索では、シソーラス用語を追加して、別の名前/用語で用語を検索することもできます。

設定するのは少し手間がかかりますが、いったん完了すると、基になるテーブルにレコードを挿入すると、必要な項目がフルテキストインデックスに自動的に追加されます。フルテキストの更新はリアルタイムではありませんが、外部の検索エンジンにデータを入力するためにデータをエクスポートする必要がある場合よりもかなり高速です。

全文検索を使用して検索を最適化するためのヒントとコツがあります。製品の説明をカテゴリ内で検索したいとします。製品リストが膨大な場合、ProdCat:Footwearなどの明示的な文字列を組み立てるVARCHARフィールドがあると、価値があるかもしれません。これにより、全文検索で、フリーテキスト検索だけでなく、すべての検索条件を満たすことができます。

フルテキストインデックスのバックアップ方法など、追加のDB管理のニーズがありますが、とにかく外部製品で同様の手法を学ぶ必要があります。

2
Dave Poole

あなたの例( "%Football Size%")で単語全体を検索していると仮定します(つまり、「WomensFootball Size」またはその類の何かを含むテキストではなく、「Womens Football Size」を検索します)。 Full Text Index のように聞こえますが、一見の価値があります。

1
Conflab