SQLでの最良のオプションは、UNION
ですこの場合、distinctは冗長です。このクエリを別の方法で作成してより高速に実行する方法はありません。 200,000以上の行の検索を高速化する魔法の式はありません。テーブルのすべての行を2回検索して一意性をソートする必要があります。これはまさにUNION
が行うことです。
これを高速化できる唯一の方法は、2つのフィールドに別々のインデックスを作成するか(多分)、検索しているデータのセットを減らすことです。
また、これを多く実行して新しいフィールドを追加することはめったにない場合は、マテリアライズド・ビューを使用して結果を格納し、定期的にリフレッシュする必要があります。
ちなみに、2番目のクエリは、あなたが望むようには表示されません。 Distinct
は常にselect
セクションのすべての列に適用されるため、フィールド名を含む定数により、クエリは常に2つの列の個別の行を返します。
私は実験的に少し速いと思われる別の方法を考え出しました。これにより、デカルト結合のためのフルテーブルスキャンを1つ取引することができます。ほとんどの場合、クエリが何をしているかがはっきりしているので、私はまだunion
を使用することを選択します。
SELECT DISTINCT CASE lvl WHEN 1 THEN field1 ELSE field2 END
FROM table
CROSS JOIN (SELECT LEVEL lvl
FROM DUAL
CONNECT BY LEVEL <= 2);
それは私800,000行を含む便利なインデックスせずにテーブルの上に両方のクエリをテストし、それが(145,000行を返す)大体45秒かかったことを追加することも価値があります。しかし、その時間の大部分は、実際にレコードをフェッチするために費やされたもので、クエリを実行していませんでした(クエリには3〜7秒かかりました)。大量の行が戻ってきた場合は、表示されているパフォーマンスの問題の原因となっている行の数にすぎないことがあります。
ですから、単一のレコードに選択クエリの出力を連結しようとしている、あなたではありませんか?このようなもの? http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:229614022562 – Aitor
「遅すぎます」という速度はどれくらいですか?私たちは何冊のレコードを話していますか?総レコード数のうち、いくつの異なる値がありますか? – APC
@APCオプション2は約80秒で、108443レコードになります。 – Rodriguez