1

クエリ 1:

select a.*
from 
   (
   select 
row_number() over (order by id desc) as srno
id,name as myname,*
   from table
where name like 'search%' or column1 like 'search%' or column2 like 'search%'
or column3 like 'search%'
or column4 like 'search%'
or column5 like 'search%'
   ) a
where srno>=1 and srno<=50

テーブルに 100,000 行あります。このクエリの実行には 48 秒かかります。代替クエリを適用しました:

クエリ 2:

 select top 50
row_number() over (order by id desc) as srno
id,name as myname,*
   from table
where name like 'search%' or column1 like 'search%' or column2 like 'search%'
or column3 like 'search%'
or column4 like 'search%'
or column5 like 'search%'

クエリ 2 の実行には約 0 秒かかります インデックス作成が行われます すべて準備完了 両方のケースで適用されます

クエリ 1 を 0 秒以内に実行する方法はありますか?

実行速度をリアルタイムで表示したい。

4

5 に答える 5

1

いいえ。

2 番目のクエリでは、50 件のレコードがあれば完了です。最初のクエリでは、100.000 レコードすべてをチェックしてから、最初の 50 レコードのみを取得します。

ここで、最初の 50 レコードのみをチェックしたい場合は、次のようにしてみてください。

select a.*
from 
   (
   select 
row_number() over (order by id desc) as srno
id,name as myname,*
   from table
   ) a
where srno>=1 and srno<=5
and (a.name like 'search%'
 or a.column1 like 'search%'
 or a.column2 like 'search%'
 or a.column3 like 'search%'
 or a.column4 like 'search%'
 or a.column5 like 'search%')
于 2012-05-11T12:39:14.040 に答える
1

ここで分析関数を使用する必要はないと思いROW_NUMBER()ます。行は で識別でき、結果を 50 行に制限するためにのみ をid 使用している可能性があります。srnしたがって、これを簡単に行うことができます:

SELECT TOP (50)
      id
    , name AS myname 
    , *
FROM  table
WHERE name LIKE 'search%' 
   OR column1 LIKE 'search%' 
   OR column2 LIKE 'search%'
   OR column3 LIKE 'search%'
   OR column4 LIKE 'search%'
   OR column5 LIKE 'search%'
ORDER BY id DESC
于 2012-05-11T13:29:11.883 に答える
0

これらすべての正規表現と多くの行を使用すると、それを改善するためにできることはあまりありません。全文検索フィールドを配置するか、入力を消去して、そのタイプの正規表現を含むすべてのデータが別のテーブルに移動するようにします。とにかく、テーブルが成長し続ける場合、正規表現は非常に遅くなります。すぐに多くのパフォーマンスを期待しないでください。

于 2012-05-11T12:37:54.947 に答える
0

列の値を連結し、LIKE 演算子を適用して値を探します。

SELECT a.* 
FROM   (SELECT Row_number() OVER (ORDER BY id DESC) AS srno, 
               id, 
               name                                 AS myname, 
               * 
        FROM   mytable) a 
WHERE  ( Isnull(a.name, '') + Isnull(a.column1, '') + Isnull(a.column2, '') + 
                  Isnull(a.column3, '') + Isnull(a.column4, '') + 
       Isnull(a.column5, '') ) LIKE 'search%' 
       AND srno >= 1 
       AND srno <= 50 
于 2012-05-11T12:48:26.690 に答える
0

どちらの場合も同じ結果セットが得られているようです。

最初のステートメントでは、テーブル全体を検索してからフィルタリングを行います。2 番目のステートメントは、最初の 50 レコードに到達すると停止します。これは、より高速であることを意味します。2番目のものと一緒に行きます。

于 2012-05-11T12:41:10.530 に答える