2012-03-27 31 views
0

私は次の2つのクエリを持っています。私は3つのインデックススキャン(2つ目)を使うのではなく、より効率的だと考えています。また、2番目のクエリに含まれる3つのカウントから1つのカウントを取得するにはどうすればよいですか?どうすれば1つにまとめることができますか?どちらのクエリがより効率的ですか?

最初のクエリ

SELECT count(*) FROM bldng 
WHERE (bldng_type LIKE '%PTR%' OR bldng_type LIKE '%FACILITY-A%' 
OR bldng_type LIKE '%FACILITY-B%') AND area_sqf > 500 

2番目のクエリ

SELECT count(*) FROM bldng WHERE bldng_type LIKE '%PTR%' AND area_sqf > 500 
UNION ALL 
SELECT count(*) FROM bldng WHERE bldng_type LIKE '%FACILITY-A%' AND area_sqf > 500 
UNION ALL 
SELECT count(*) FROM bldng WHERE bldng_type LIKE '%FACILITY-B%' AND area_sqf > 500 

[OK]を、これは

まず(シングル '設定統計が上ioを' で、私は両方のクエリを実行した後に私が思い付いた結果であり、行)クエリ:

Category Timestamp Duration Message Line Position 
Connection 3/27/2012 2:36:49 PM  3615: Table 'bldng'. Scan count 1, logical reads 33320, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 1 0 

2番目のクエリ:

Category Timestamp Duration Message Line Position 
Connection 3/27/2012 2:38:15 PM  3615: Table 'bldng'. Scan count 15, logical reads 76703, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 1 0 

Category Timestamp Duration Message Line Position 
Connection 3/27/2012 2:38:15 PM  3615: Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 1 0 

は、私もこれらを解釈するかどうかはわかりません。論理読み込みを33320 < 76703と比較しますか?だから最初のものはそれがより効率的に実行されていることを意味していますか?

+2

どのDBMSを使用していますか?各クエリの実行計画を確認しましたか? –

+1

また、これらのクエリは2つの異なることを行います。あなたのすべての基準に一致するレコードの数を取得しようとしていますか? –

+0

データベースはSQL Server 2005 – dido

答えて

0

通常、1つのステートメントを実行する方が、3つのステートメントを実行してから結果を結合するより効率的です。

私が提供したすべてのフィルタの合計数(最初のクエリの合計に2番目のクエリの3行を加算する)が必要な場合を想定しています。

「3つのインデックスを使用する」と言うとき、bldng_type列に3つの異なるインデックスを作成しましたか?

通常は、3つすべてのフィルタ、area_sqf列のフィルタ、およびフィルタの結果のカウントを使用して、bldng_type列のインデックスに対してフィルタを実行するだけなので、最初のステートメントを使用します。

2番目を実行すると、テーブルを3回クエリし、結果を一緒に結合しようとすることがあります。

しかし実際には、クエリの実行計画を見て、それが何をしているのかを判断する必要があります。

+0

まあ、両方のステートメントを実行すると、最初のステートメントは常に2番目のステートメントよりも遅く実行されるようです(ステートメントを実行するのにかかる時間を比較します)。あなたは実行計画によって何を意味するのか分かりません。私はちょうど新しいプロジェクトのためにこれらを書いています。それ以外のものは実際にはまだ開発されていません...(私が使用しているエディタから)実行するのにかかる時間に関する情報は信頼できますか? – dido

0

SQLのエキスパートではありませんが、私が覚えているところでは、オプティマイザがその仕事をよりうまくやってくれるため、通常は1つのステートメントが優れています。短絡ブール論理は保証されていませんが、最初の文でオプティマイザで使用できるオプションですが、2番目のオプションでは明示的に回避します。また、OR比較をカッコでグループ化して優先順位を付けることもできます。

2

最初に書いた文は、bldng_type列のインデックスを使用していません。 LIKE文字列の先頭のワイルドカードとの比較は最適化できません。

この場合、3つの別々のスキャンではなく1回のテーブルスキャンが必要なので、最初のクエリがより効率的であると思います。しかし、以下を参照してください。

"より効率的なクエリ"についての質問は、データベースエンジンによって生成されたクエリプランを調べることによってのみ回答できます。この計画は、クエリの構造だけでなく、比較対象の列について収集された統計情報や、データベースにデータを挿入して更新するときに統計が変化するため、時間の経過とともに最も効率的なクエリプランが変更される可能性があります同じように。

最後に、「完全な」データベースエンジンは、すべての意味的に同一のクエリを同じ最適化されたクエリプランに縮小します。クエリが実際に異なる結果を生成するため、引用した場合は不可能です。しかし、あなたが認識可能に同じであるようにクエリを書いた場合、同じ時間内に(完全なデータベースエンジンで)実行する必要があります。

関連する問題