Oracle
 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>

Без паралелен намек, без паралелни обекти, без сканиране на пълни таблици, без сканиране на диапазон на индекс, обхващащ множество дялове, и скаларна подзаявка.

Не е изпълнено нито едно условие , но заявката все още използва паралелизъм. (Проверих също v$px_process за да се уверите, че заявката наистина използва паралелизъм и не е просто обяснение на провал на плана.)

Това означава, че отговорът на другия ви въпрос е грешен.

Не съм сигурен какво точно се случва в този случай, но мисля, че е свързано с FAST DUAL оптимизация. В някои контексти DUAL не се използва като таблица, така че няма какво да се паралелизира. Това вероятно е "бъг", но ако използвате DUAL, тогава наистина не искате паралелизъм. (Въпреки че предполагам, че сте използвали DUAL за демонстрационни цели и истинската ви заявка е по-сложна. Ако е така, може да се наложи да актуализирате заявката с по-реалистичен пример.)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Извличане на общия брой секунди от интервален тип данни

  2. Най-добри практики:.NET:Как да върна PK срещу база данни на Oracle?

  3. Кой тип данни .NET е най-подходящ за картографиране на типа данни NUMBER Oracle в NHibernate?

  4. Каква е настройката за преглед на частта от часа с дата в разработчика на Oracle PL/SQL?

  5. Как да получа колона с първичен ключ в Oracle?