sql >> Databáze >  >> RDS >> Oracle

Oracle:existuje nějaký logický důvod, proč nepoužívat paralelní spouštění s poddotazy v seznamu SELECT?

Každá položka v tomto seznamu je nesprávná.

(Přinejmenším pro Oracle 11gR2 a pravděpodobně také 10g. Seznam může být přesný pro některé zastaralé verze Oracle.)

Doporučuji používat oficiální dokumentaci Oracle, kdykoli je to možné, ale kapitola o paralelním provádění není příliš přesná.

A i když manuál nemá chybu, je často zavádějící, protože paralelní provádění je velmi komplikované. Pokud si projdete veškerou dokumentaci, zjistíte, že existuje asi 30 různých proměnných, které určují stupeň paralelismu. Pokud někdy uvidíte krátký kontrolní seznam položek, měli byste být velmi skeptičtí. Tyto kontrolní seznamy jsou obvykle jen nejrelevantnějšími položkami, které je třeba zvážit ve velmi specifickém kontextu.

Příklad:

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>

Žádná paralelní nápověda, žádné paralelní objekty, žádné prohledávání celé tabulky, žádné prohledávání rozsahu indexů zahrnujících více oddílů a skalární poddotaz.

Nebyla splněna ani jedna podmínka , přesto dotaz stále používá paralelismus. (Také jsem ověřil v$px_process abychom se ujistili, že dotaz skutečně používá paralelismus a není to jen selhání plánu vysvětlení.)

To znamená, že odpověď na vaši další otázku je nesprávná.

Nejsem si jistý, co přesně se v tomto případě děje, ale myslím, že to má co do činění s FAST DUAL optimalizace. V některých kontextech se DUAL nepoužívá jako tabulka, takže není co paralelizovat. Toto je pravděpodobně "chyba", ale pokud používáte DUAL, tak stejně nechcete paralelismus. (Předpokládám, že jste pro demonstrační účely použili DUAL a váš skutečný dotaz je složitější. Pokud ano, možná budete muset dotaz aktualizovat realističtějším příkladem.)




  1. Jak funguje Unicode() v SQLite

  2. Jak se vyhnout zablokování SQL pomocí ladění dotazů:Rada od Brenta Ozara

  3. Neo4j - Import dat ze souboru CSV pomocí Cypher

  4. SQL, jak zřetězit výsledky?