Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle:existe algum motivo lógico para não usar execução paralela com subconsultas na lista SELECT?


Todos os itens dessa lista estão errados.

(Pelo menos para Oracle 11gR2, e provavelmente 10g também. A lista pode ser precisa para algumas versões obsoletas do Oracle.)

Recomendo usar a documentação oficial da Oracle sempre que possível, mas o capítulo de execução paralela não é muito preciso.

E mesmo quando o manual não está errado, muitas vezes é enganoso, porque a execução paralela é muito complicada. Se você passar por toda a documentação, descobrirá que existem cerca de 30 variáveis ​​diferentes que determinam o grau de paralelismo. Se você vir uma pequena lista de verificação de itens, deve ser muito cético. Essas listas de verificação geralmente são apenas os itens mais relevantes a serem considerados em um contexto muito específico.

Exemplo:
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>

Nenhuma dica paralela, nenhum objeto paralelo, nenhuma varredura de tabela completa, nenhuma varredura de intervalo de índice abrangendo várias partições e uma subconsulta escalar.

Nenhuma condição foi atendida , mas a consulta ainda usa paralelismo. (Também verifiquei v$px_process para garantir que a consulta realmente use paralelismo e não seja apenas uma falha no plano de explicação.)

Isso significa que a resposta para sua outra pergunta está errada.

Não sei exatamente o que está acontecendo nesse caso, mas acho que tem a ver com o FAST DUAL otimização. Em alguns contextos, DUAL não é usado como uma tabela, então não há nada para paralelizar. Este é provavelmente um "bug", mas se você estiver usando DUAL, então você realmente não quer paralelismo de qualquer maneira. (Embora eu suponha que você tenha usado DUAL para fins de demonstração e sua consulta real seja mais complicada. Nesse caso, talvez seja necessário atualizar a consulta com um exemplo mais realista.)