0

いくつかのかなり大きなテーブル (数百万レコード) でのテーブル スキャンを含む多数のクエリを作成する必要があることに直面しています。

(私はこれがひどい考えであることを知っており、これを含まない代替アプローチを推進していますが、今のところそれは私が立ち往生しているものです。また、関連するフィールドにインデックスを作成することも、おそらく承認されたオプションではありません。 .)

一部のテーブルでは、ターゲット値に一致する複数のフィールドがあります。OR を使用した単一のクエリは、複数のクエリよりも高速であると思いますが、確認したいと思います。あれは:

SELECT keyinfo FROM TABLE1 WHERE field1 = target OR field2 = target OR field3 = target;

よりも良いだろう

SELECT whatever FROM TABLE1 WHERE field1 = target; 
SELECT whatever FROM TABLE1 WHERE field2 = target; 
SELECT whatever FROM TABLE1 WHERE field3 = target; 

テーブルを 1 回スキャンするだけなので、直感的には正しいように思えます。ただし、複数のフィールドをテストする必要があるため、それによってどれだけの利益が失われるかはわかりません. 簡単なテストでこれが証明されましたが、結果に影響を与えている一時的なインデックスがバックグラウンドで構築されているかどうかはわかりません。

詳細情報: ほとんどの場合、一致が見つからないことが予想されますが、存在する場合はすべての一致が必要であるため、FETCH FIRST 1 ROWS ONLY に限定することはできません。また、z/OS DB2 です。

おそらく複数のターゲットに対してこれを実行する必要があることを考えると、関連するすべてのフィールドを一時テーブルに引き出すことになるでしょう。はるかに速くなります。しかし、テーブルスキャンの質問に興味があります。

4

2 に答える 2

1

or必ずしも良いとは限りません。orデータベースは、複数のフィールドの条件にインデックスを使用するのに苦労する場合があります。DB2 は、この場合に最適化するには十分である可能性があります。ただし、パフォーマンス (および実行計画) を次のように比較できます。

SELECT whatever FROM TABLE1 WHERE field1 = target
UNION ALL
SELECT whatever FROM TABLE1 WHERE field2 = target AND field1 <> target
UNION ALL
SELECT whatever FROM TABLE1 WHERE field3 = target AND field1 <> targe AND field2 <> target; 
于 2017-02-14T13:39:28.270 に答える