UNION
また、クエリは、特定の状況下で -connected 述語UNION ALL
を使用して同等のクエリよりも優れたパフォーマンスを発揮する場合があります。OR
私の知る限り、これは部分的には、UNION
サブセレクトを並行して実行できるため、OR
-connected 述語の各部分に固有の独自の「サブプラン」を持つことができるためです。これは、適用可能なクエリ変換がより単純であるため、おそらくはるかに最適です。
しかし、サブクエリ因数分解がソリューションに適用されたとしても、 -connected 述語を書くことOR
は、通常、はるかに読みやすく簡潔です。私の質問は次のとおりです。コストのかかる単一の接続された述語を操作に変換する必要があるUNION ALL
ことをオラクルに示す方法はありますか? そのようなヒント/メソッドがある場合、どのような状況で適用できますか (たとえば、述語に含まれる列に制約が存在する必要があるかなど)? 例:OR
UNION ALL
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 を使用できます。