2012-03-15 10 views
2

OracleがSELECTリストのスカラー副問合せとの並列実行を使用しないという論理的な理由はありますか?なぜそれを使うべきではないのですか?クエリにいうOracle:SELECTリスト内でサブクエリとの並列実行を使用しないという論理的な理由はありますか?

  • クエリが並列ヒント指定(PARALLELまたは PARALLEL_INDEX)またはスキーマ・オブジェクトを含む:

    A SELECT文は次 条件が満たされた場合にのみ並列化することができますそれらに関連付けられた のPARALLEL宣言があります。

    • フルテーブルスキャン

    • 複数のパーティション

  • にまたがる索引レンジ・スキャンをクエリで指定されたテーブルの

  • 少なくとも一つは、以下 のいずれかを必要とします

  • スカラーサブクエリはSELECTリストにありません。

+0

サブクエリが'SELECT'リストしかし、あなたの最後の文は、SELECTリストにスカラ副問合せがないと言います。 'SELECT'リスト内でスカラー副問い合わせではない副問い合わせをどのように持つことができますか?そして、非並列実行プランを選択することがなぜ好ましいか尋ねていますか?なぜ並列処理が不可能なのか? –

+1

@JustinCave - OPは、以前の質問に対するこの回答で引用したOracleのマニュアルを引用しています。 http://stackoverflow.com/a/9724227/146325彼らだけがフォーマットをうんざりし、プロセスの意味を変えました。 – APC

+0

私は並列処理が不可能な理由を尋ねています – Revious

答えて

4

そのlist内のすべての項目が間違っています。

(少なくともオラクル11gR2のため、同様にprobably10g。リストは、Oracleの一部廃止されたバージョンの正確かもしれません。)

私は可能な限り公式Oracleのドキュメントを使用することをお勧めしますが、並列実行章あまり正確ではありません。

マニュアルが間違っていない場合でも、パラレル実行が非常に複雑であるため、誤解を招くことがよくあります。すべてのドキュメントを見ると、並列性の程度を決める約30種類の変数があります。あなたが項目の短いチェックリストを見たことがあるなら、あなたは非常に懐疑的であるべきです。これらのチェックリストは、通常、非常に具体的な状況で考慮する最も関連性の高い項目です。


例:

SQL> --Create a table without any parallel settings 
SQL> create table parallel_test(a number primary key, b number); 

Table created. 

SQL> --Create some test data 
SQL> insert into parallel_test 
    2 select level, level from dual connect by level <= 100000; 

100000 rows created. 

SQL> commit; 

Commit complete. 

SQL> --Force the session to run the query in parallel 
SQL> alter session force parallel query; 

Session altered. 
SQL> --Generate explain plan 
SQL> explain plan for 
    2 select a 
    3  ,(
    4    select a 
    5    from parallel_test parallel_test2 
    6    where parallel_test2.a = parallel_test.a 
    7 ) 
    8 from parallel_test; 

Explained. 

SQL> select * from table(dbms_xplan.display); 

PLAN_TABLE_OUTPUT 
------------------------------------------------------------------------------------------------------------------------ 
Plan hash value: 3823224058 

--------------------------------------------------------------------------------------------------------------------- 
| Id | Operation    | Name   | Rows | Bytes | Cost (%CPU)| Time  | TQ |IN-OUT| PQ Distrib | 
--------------------------------------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT  |    | 116K| 1477K|  9 (0)| 00:00:01 |  |  |   | 
|* 1 | INDEX UNIQUE SCAN  | SYS_C0028894 |  1 | 13 |  1 (0)| 00:00:01 |  |  |   | 
| 2 | PX COORDINATOR   |    |  |  |   |   |  |  |   | 
| 3 | PX SEND QC (RANDOM) | :TQ10000  | 116K| 1477K|  9 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) | 
| 4 | PX BLOCK ITERATOR |    | 116K| 1477K|  9 (0)| 00:00:01 | Q1,00 | PCWC |   | 
| 5 |  INDEX FAST FULL SCAN| SYS_C0028894 | 116K| 1477K|  9 (0)| 00:00:01 | Q1,00 | PCWP |   | 
--------------------------------------------------------------------------------------------------------------------- 

Predicate Information (identified by operation id): 
--------------------------------------------------- 

    1 - access("PARALLEL_TEST2"."A"=:B1) 

Note 
----- 
    - dynamic sampling used for this statement (level=2) 

21 rows selected. 

SQL> 

いいえ平行ヒント、無平行オブジェクト、無フルテーブルスキャン、複数のパーティションにまたがるないインデックス範囲スキャン、およびスカラーサブクエリ。

単一の条件がと一致していないにもかかわらず、依然として並列処理が使用されています。 (私も、クエリが実際に並列処理を使用しないことを確認するv$px_processを検証し、それだけで実行計画の失敗ではありません。)


これはあなたのother questionへの答えが間違っていることを意味します。

私はこの場合に起こっていることを正確にはわかりませんが、それはFAST DUALの最適化と関係があると思います。状況によっては、DUALは表として使用されないため、並列化するものはありません。これはおそらく「バグ」ですが、DUALを使用している場合は、とにかく並列性は望ましくありません。 DUALをデモンストレーションの目的で使用したと仮定していますが、実際のクエリがより複雑な場合は、より現実的な例を使用してクエリを更新する必要があります)。

+0

Jon - OPは他の質問のテキストを編集しました。もともと彼らは実際のクエリを投稿しました。あなたは私の答えの中の一つのテーブルへの参照を見ることができます。実際のクエリは、FROM句とスカラーサブクエリで複数のテーブルを結合することで、その置換よりも複雑になりました。私はあなたがスカラーサブクエリが参照テーブルに直接バインドされていることが、並列実行を見ている理由だと思います。これは、OPの原文では当てはまりませんでした。 – APC

+1

私は今Oracleにアクセスできませんが、週末にはもっと現実的なテストをします。 – APC

+0

@APCスカラーサブクエリで別のテーブルを使ってテストを実行しましたが、まだパラレルで実行されています。スカラーサブクエリを追加すると並列実行が停止するケースがあると確信していますが、それは他の変更の副作用としてのみです。元のクエリをもう一度見ていきます。 (一般的に、 'DUAL'を使ってすべての問題をクエリに還元するのは良い考えですが、この問題は例外です)。 –

関連する問題