sql >> Base de Datos >  >> RDS >> Oracle

Oracle:¿hay alguna razón lógica para no usar la ejecución paralela con subconsultas en la lista SELECT?

Todos los elementos de esa lista son incorrectos.

(Al menos para Oracle 11gR2, y probablemente también para 10g. La lista puede ser precisa para algunas versiones obsoletas de Oracle).

Recomiendo usar la documentación oficial de Oracle siempre que sea posible, pero el capítulo de ejecución en paralelo no es muy preciso.

E incluso cuando el manual no está mal, a menudo es engañoso, porque la ejecución en paralelo es muy complicada. Si revisa toda la documentación, encontrará que hay alrededor de 30 variables diferentes que determinan el grado de paralelismo. Si alguna vez ve una breve lista de verificación de elementos, debe ser muy escéptico. Esas listas de verificación suelen ser solo los elementos más relevantes a considerar en un contexto muy específico.

Ejemplo:

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>

Sin sugerencias paralelas, sin objetos paralelos, sin exploraciones de tablas completas, sin exploraciones de rango de índice que abarquen varias particiones y una subconsulta escalar.

No se cumplió ni una sola condición , sin embargo, la consulta todavía usa el paralelismo. (También verifiqué v$px_process para asegurarse de que la consulta realmente use paralelismo, y no sea solo una falla del plan de explicación).

Esto significa que la respuesta a su otra pregunta es incorrecta.

No estoy seguro de qué está pasando exactamente en ese caso, pero creo que tiene que ver con el FAST DUAL mejoramiento. En algunos contextos, DUAL no se usa como tabla, por lo que no hay nada que paralelizar. Esto es probablemente un "error", pero si está usando DUAL, entonces realmente no quiere paralelismo de todos modos. (Aunque supongo que usó DUAL con fines de demostración y su consulta real es más complicada. Si es así, es posible que deba actualizar la consulta con un ejemplo más realista).