1

ここで助けが必要です。条件に応じてデータを取得しています

ここでは、クライアントが任意の単語で検索を使用できるような演算子を使用しているため、以下のロジックがありますが、ここでは取得時間が長すぎて (4 分かかります)、データを取得するには遅すぎます。

テーブルへのすべてのインデックス作成を行いましたが、クエリを最適化できません。

select * from author where ('% Walmart %' のようなアドレス OR 'Walmart %' のようなアドレス OR '% Walmart' のようなアドレス OR '% Walmart.com %' のようなアドレス OR 'Walmart.com %' のようなアドレス OR ' のようなアドレス% Walmart.com' OR '% Walmarts %' のような住所 OR 'Walmarts %' のような住所 OR '% Walmarts' のような住所 OR '% Walmarts.com %' のような住所 OR 'Walmarts.com %' のような住所 OR ' のような住所% Walmarts.com')

-- 結果は 1 行

この論理に従えば

select * from author where address like '%Walmart%'

-- 結果は 44 行です - すべての行をフェッチしています

しかし、私はその1行だけを取得する必要があります

4

6 に答える 6

3

私はこれがあなたがwhere条項で必要とする唯一のものであると信じています、それはその単語を含むすべてをカバーするべきです:

select * from authors
where address like '%' + @word + '%'

実際には、where句の2行目ですでにこれを行っています。

or like '%'+@word+'%'

そしてそれはすべてをカバーし、他のすべてを過剰にします。それらを削除すると、おそらく少しスピードアップします:

declare @title varchar(20)

set @title = 'coll' set @title = LTRIM(rtrim(@title))

select * from authors
where address like '%'+@title+'%'
于 2012-10-25T19:19:16.233 に答える
2

テキスト列で適切なパフォーマンスを得たい場合は、全文検索を使用する必要があります。

http://msdn.microsoft.com/en-us/library/ms142571.aspx

于 2012-10-25T19:24:11.653 に答える
2

索引付けが役に立たない可能性が非常に高いです。多くの場合、Like ステートメントを使用する場合、インデックスは使用できません。許可している検索のタイプ​​は非常に非効率的です。おそらく、このクエリはアドレス テーブルをスキャンします。テーブルにかなりの数の行がある場合、ご覧のとおり、これには長い時間がかかります。

全文検索を調べたほうがいいかもしれません。

于 2012-10-25T19:15:06.437 に答える
0

そのようなワイルドカード検索はインデックスでは役に立ちません。代わりに全文検索を見てみてください

これはインデックスを利用します、それはおそらくシークをします

address like @wordcom+' %

これはインデックスを利用せず、インデックス全体をスキャンする必要があります

address like '% '+@wordcom+' %'

上記のように、代わりに全文検索を使用してください

于 2012-10-25T19:19:09.957 に答える
0

他の人が言ったように、必要なのは

select * from authors where address like '%' + @word + '%'

オプティマイザーが私たちがあなたに言っていることを理解した場合、これは物事をあまりスピードアップしないかもしれません. (また、インデックスは役に立ちません。全文検索を使用することは、他の人からの良い提案です)。

上記のクエリだけで十分な理由がわからない場合は、クエリを見てみましょう。

select * from authors
where address like @word or address like '% '+ @word
 or address like @word+' %' or address like '%'+@word+'%'
 or address like '% '+@word+' %' or address like @words
 or address like '% '+@words or address like @words+' %'
 or address like '%'+@words+'%' or address like '% '+@words+' %'
 or address like @wordcom or address like '% '+@wordcom
 or address like @wordcom+' %' or address like '%'+@wordcom+'%'
 or address like '% '+@wordcom+' %' or address like @wordscom
 or address like '% '+@wordscom or address like @wordscom+' %'
 or address like '% '+@wordscom+' %'

「like @word + '%'」があるので、レコードが「like @word」に一致する場合、「like @word + '%'」にも一致することに注意してください。したがって、@word はこれ以上結果を追加しません。「または」があるため、@word が一致しようとしているか、または単に @word+'%' からの結果が得られているかにかかわらず、結果は同じになります。

そのロジックを適用すると、クエリは次のように簡略化できます。

select * from authors
where address like @word+' %' or address like '%'+@word+'%'
 or address like @words+' %' or address like '%'+@words+'%'
 or address like @wordcom+' %' or address like '%'+@wordcom+'%'
 or address like @wordscom+' %' or address like '% '+@wordscom+' %'

同様に、@word は '%'+@word にまだ含まれていないものを追加しないため、クエリは次のように単純化されます。

select * from authors
where address like '%'+@word+'%'
 or address like '%'+@words+'%'
 or address like '%'+@wordcom+'%'
 or address like '% '+@wordscom+' %'

さらに、'%'+@word+'s%'、'%'+@word+'.com%'、または '%'+@word+'s.com%' で見つかったものはすべて、'%'+@word+'%' で見つかります。 .

于 2012-10-25T19:38:13.510 に答える
0

QUERY で LIKE を使用している場合は、二重の %% を使用して、フィルタリングする値をラップしてください。これが最善の解決策です。解決策が気に入ったら投票してください。たとえば、私の場合、これはメインクエリと連結されました

filter_value = "'%%"+filter_value+"%%'"
于 2013-08-20T13:26:31.767 に答える