sql >> データベース >  >> RDS >> Oracle

Oracle:SELECTリストのサブクエリで並列実行を使用しない論理的な理由はありますか?

    そのリストのすべての項目が間違っています。

    (少なくともOracle 11gR2の場合、おそらく10gも同様です。このリストは、一部の廃止されたバージョンの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>
    

    並列ヒント、並列オブジェクト、全表スキャン、複数のパーティションにまたがるインデックス範囲スキャン、およびスカラーサブクエリはありません。

    満たされた条件は1つではありません 、それでもクエリは並列処理を使用します。 (v$px_processも確認しました クエリが実際に並列処理を使用していることを確認します。これは単なる説明プランの失敗ではありません。)

    これは、他の質問に対する答えが間違っていることを意味します。

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




    1. XMLをCLOB列からXMLType列に変換するときにエラーが発生しました

    2. dbms_schedulerを使用して30分ごとにジョブを実行する方法

    3. オートコンプリートフィールド用の同様のUTF-8文字列

    4. OracleSQLの動的ピボット