3

いくつかのテーブルを結合するSQLクエリがあり、結果セットの多くの列に対して同じLIKE条件を使用してレコードをフィルタリングしたいと思います。たとえば、クエリに列t1.Name、t1.FullName、t1.Comment、t2.Name、t3.Descriptionなどがあり(t1、t2、t3は結合されたテーブル名です)、t1.Nameかどうかを確認したいと思います。またはt1.FullNameまたはt1.Commentまたはt2.Nameまたはt3.DescriptionはLIKE'%sometext%'です。どのSQLがより高速になるのか興味がありますか?

WHERE t1.FullName LIKE '%sometext%' OR t1.Comment LIKE '%sometext%' OR
      t2.Name LIKE '%sometext%' OR t3.Description  LIKE '%sometext%'

また

WHERE ISNULL(t1.Name,'') + '|' + ISNULL(t1.FullName,'') + '|' + ISNULL(t1.Comment,'') + '|' + ISNULL(t2.Name,'') + '|' + ISNULL(t3.Description,'') LIKE '%sometext%'

それとももっと速い方法があるのでしょうか?MS SQL Server2008R2を使用しています。

UPD: 2番目のクエリを編集して、一部のフィールドがNULLであり、連結にパターンが含まれている可能性があるが、フィールドが個別に含まれていない状況を処理しました。

4

5 に答える 5

1

最善の方法は、を使用することFULL-TEXT SEARCHです。

WHERE t1.FullName LIKE '%sometext%'たとえば、を使用すると、サーバーがその列のインデックスを使用するのを停止します。

于 2012-11-01T11:18:21.733 に答える
1

私はそれを次のように書き続けます:

WHERE t1.FullName LIKE '%sometext%' OR t1.Comment LIKE '%sometext%' OR
      t2.Name LIKE '%sometext%' OR t3.Description  LIKE '%sometext%'

後者を使用しない理由はいくつかありますが、高速化すら効果がありません。

  1. 文字列の要約統計量は、クエリを処理するために使用される場合があり、例外的な状況では、異なる列の異なるインデックスを組み合わせる場合があります。これは、連結されたテキストでは不可能です
  2. t1.FullName + ....NULLになる可能性があります-これを処理する必要があります
  3. t1.FullName + ....t1.Commentとt2.Nameの間にテキストが見つかる可能性があります。
    • t1。コメントハブへようこそ
    • t2.Name=ブレナム
    • sometext='ハッブル'
    • .. t1.Comment + t2.Name ... =... hubBlenheimハッブルmatches
于 2012-11-01T11:26:46.017 に答える
1

これは、列のサイズと数、および検索文字列の頻度によって異なります。そしておそらく他のもの。

2つのクエリは同じ結果を生成しないことに注意してください。連結クエリは、最初のクエリと同じ方法でNULL値を処理しません。

'%some'で終わる名前と'text%'で始まる説明も想像してみてください。

于 2012-11-01T11:36:16.687 に答える
0

私は2番目の方法がより良いと思います:

WHERE t1.Name + t1.FullName + t1.Comment + t2.Name + t3.Description LIKE '%sometext%'

ただし、どちらのクエリにも長所と短所があります。これらのフィールドに非常に大きな(長い)データが含まれている場合、クエリ#1はより高速に機能します。

于 2012-11-01T11:20:44.597 に答える
0
"WHERE t1.FullName LIKE '%sometext%' OR t1.Comment LIKE '%sometext%' OR
      t2.Name LIKE '%sometext%' OR t3.Description  LIKE '%sometext%'"
or

"WHERE t1.Name + t1.FullName + t1.Comment + t2.Name + t3.Description LIKE '%sometext%'"

=============
Here Both are take same time bacause each condition is checked by separatly one by one.
No way to differnce in both condition.
于 2012-11-01T11:31:32.343 に答える