Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Oracle:apakah ada alasan logis untuk tidak menggunakan eksekusi paralel dengan subquery dalam daftar SELECT?

Setiap item dalam daftar itu salah.

(Setidaknya untuk Oracle 11gR2, dan mungkin juga 10g. Daftar ini mungkin akurat untuk beberapa versi Oracle yang sudah usang.)

Saya merekomendasikan penggunaan dokumentasi Oracle resmi bila memungkinkan, tetapi bab eksekusi paralel tidak terlalu akurat.

Dan bahkan ketika manualnya tidak salah, seringkali menyesatkan, karena eksekusi paralel sangat rumit. Jika Anda membaca semua dokumentasi, Anda akan menemukan sekitar 30 variabel berbeda yang menentukan derajat paralelisme. Jika Anda pernah melihat daftar pendek item, Anda harus sangat skeptis. Daftar periksa tersebut biasanya hanya item yang paling relevan untuk dipertimbangkan dalam konteks yang sangat spesifik.

Contoh:

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>

Tidak ada petunjuk paralel, tidak ada objek paralel, tidak ada pemindaian tabel lengkap, tidak ada pemindaian rentang indeks yang mencakup beberapa partisi, dan subkueri skalar.

Tidak ada satu pun kondisi yang terpenuhi , namun kueri masih menggunakan paralelisme. (Saya juga memverifikasi v$px_process untuk memastikan bahwa kueri benar-benar menggunakan paralelisme, dan ini bukan hanya menjelaskan kegagalan rencana.)

Ini berarti jawaban untuk pertanyaan Anda yang lain salah.

Saya tidak yakin persis apa yang terjadi dalam kasus itu, tetapi saya pikir itu ada hubungannya dengan FAST DUAL optimasi. Dalam beberapa konteks, DUAL tidak digunakan sebagai tabel, jadi tidak ada yang perlu diparalelkan. Ini mungkin "bug", tetapi jika Anda menggunakan DUAL maka Anda sebenarnya tidak menginginkan paralelisme. (Meskipun saya berasumsi Anda menggunakan DUAL untuk tujuan demonstrasi, dan kueri Anda yang sebenarnya lebih rumit. Jika demikian, Anda mungkin perlu memperbarui kueri dengan contoh yang lebih realistis.)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara menulis aplikasi .Net yang berfungsi dengan SqlServer dan Oracle (sekarang System.Data.OracleClient tidak digunakan lagi)

  2. Bagaimana menemukan baris yang terkunci di Oracle

  3. 2 Fungsi yang Mendapatkan Hari, Bulan, dan Tahun dari Tanggal di Oracle

  4. Cara Mengubah Tabel di Oracle

  5. Pengantar Kursor Ref PL/SQL Di Database Oracle