UNION
およびUNION ALL
問合せでは、特定の状況でOR
接続述語を使用して同等の問合せより優れたパフォーマンスを得ることができます。私が知る限り、部分的にはUNION
の副選択を並行して実行することができるため、OR
-connected述語の各部分に固有の独自の「サブプラン」を持つことができます。これはおそらく、 。ORはOR結合述語をUNION ALL操作に変換します。
OR
接続述部の作成は、サブクエリの因数分解がUNION ALL
ソリューションに適用されていても、通常ははるかに読みやすく簡潔です。私の質問です:単一の、高価なOR
接続された述語をUNION ALL
操作に変換する必要があることをOracleに示す方法はありますか?そのようなヒント/メソッドがある場合は、どのような状況で適用できるか(例えば、述語などに含まれる列に制約が存在する必要があるなど)?例:
CREATE TABLE a AS
SELECT 1 x, 2 y FROM DUAL UNION ALL
SELECT 2 x, 1 y FROM DUAL;
-- This query...
SELECT * FROM a
WHERE x = 1 OR y = 1
-- Is sometimes outperformed by this one, for more complex table sources...
-- Note: in my case, I can safely apply UNION ALL. I know the two predicates to
-- be mutually exclusive.
SELECT * FROM a
WHERE x = 1
UNION ALL
SELECT * FROM a
WHERE y = 1
注、私は/*+ USE_CONCAT */
ヒントを知ってる:
SELECT /*+ USE_CONCAT */ * FROM a
WHERE x = 1 OR y = 1
しかし、私が(実行計画には強制UNION ALL
操作)必要ないものを生成していないようです。
-------------------------------------------
| Id | Operation | Name | E-Rows |
-------------------------------------------
| 0 | SELECT STATEMENT | | |
|* 1 | TABLE ACCESS FULL| A | 2 |
-------------------------------------------
多分、このヒントにはいくつかの制限がありますか?私はOracle 11g2をこれに利用できるようにしました。
'x = 1またはy = 1'の条件が(実際のテーブルの)何行返されますか(全行の%で)? "or"クエリで 'PARALLEL'ヒントを使うのはどうですか? –
@a_horse_with_no_name:実際には、(実際の)条件は '(flag_function()= 1 and condition1)または(flag_function()= 0 and condition2)'の形式です。 2つのサブ条件は、PL/SQLの 'flag_function()'に応じてお互いを互いに排除します。私は、ORを使用するよりむしろ、 'UNION ALL'を使用するときにOracleがこれに対してより良い計画を作成することに気付きました。この場合、データの量がそれほど大きくないので、PARALLELはあまり役に立たないでしょうが、計画は複雑です...さらに、このクエリはユーザセッションで頻繁に実行されます。私は 'PARALLEL'ヒントを持つリソースをあまりにも多く使いたくないでしょう –
これらのクエリは同等ではありません。 UNION ALLではなくUNIONを使用する必要があります。 xとyの両方が1に等しい行を持っていると、異なる結果が得られます。 – GriffeyDog