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

Urutan eksekusi kondisi dalam klausa 'di mana' SQL

Apakah Anda yakin Anda "tidak memiliki wewenang" untuk melihat rencana eksekusi? Bagaimana dengan menggunakan AUTOTRACE?

SQL> set autotrace on
SQL> select * from emp
  2  join dept on dept.deptno = emp.deptno
  3  where emp.ename like 'K%'
  4  and dept.loc like 'l%'
  5  /

no rows selected


Execution Plan
----------------------------------------------------------

----------------------------------------------------------------------------------
| Id  | Operation                    | Name         | Rows  | Bytes | Cost (%CPU)|
----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |              |     1 |    62 |     4   (0)|
|   1 |  NESTED LOOPS                |              |     1 |    62 |     4   (0)|
|*  2 |   TABLE ACCESS FULL          | EMP          |     1 |    42 |     3   (0)|
|*  3 |   TABLE ACCESS BY INDEX ROWID| DEPT         |     1 |    20 |     1   (0)|
|*  4 |    INDEX UNIQUE SCAN         | SYS_C0042912 |     1 |       |     0   (0)|
----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("EMP"."ENAME" LIKE 'K%' AND "EMP"."DEPTNO" IS NOT NULL)
   3 - filter("DEPT"."LOC" LIKE 'l%')
   4 - access("DEPT"."DEPTNO"="EMP"."DEPTNO")

Seperti yang Anda lihat, itu memberikan cukup banyak detail tentang bagaimana kueri akan dieksekusi. Ini memberitahu saya bahwa:

  • syarat "emp.ename like 'K%'" akan diterapkan terlebih dahulu, pada full scan EMP
  • maka record DEPT yang cocok akan dipilih melalui indeks di dept.deptno (melalui metode NESTED LOOPS)
  • akhirnya filter "dept.loc like 'l%' akan diterapkan.

Urutan penerapan ini tidak ada hubungannya dengan cara predikat diurutkan dalam klausa WHERE, seperti yang dapat kita tunjukkan dengan kueri yang disusun ulang ini:

SQL> select * from emp
  2  join dept on dept.deptno = emp.deptno
  3  where dept.loc like 'l%'
  4  and emp.ename like 'K%';

no rows selected


Execution Plan
----------------------------------------------------------

----------------------------------------------------------------------------------
| Id  | Operation                    | Name         | Rows  | Bytes | Cost (%CPU)|
----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |              |     1 |    62 |     4   (0)|
|   1 |  NESTED LOOPS                |              |     1 |    62 |     4   (0)|
|*  2 |   TABLE ACCESS FULL          | EMP          |     1 |    42 |     3   (0)|
|*  3 |   TABLE ACCESS BY INDEX ROWID| DEPT         |     1 |    20 |     1   (0)|
|*  4 |    INDEX UNIQUE SCAN         | SYS_C0042912 |     1 |       |     0   (0)|
----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("EMP"."ENAME" LIKE 'K%' AND "EMP"."DEPTNO" IS NOT NULL)
   3 - filter("DEPT"."LOC" LIKE 'l%')
   4 - access("DEPT"."DEPTNO"="EMP"."DEPTNO")


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana Mendapatkan Nilai ASCII di Oracle?

  2. Cara Mencadangkan RAC VM

  3. Perbedaan antara kelas driver Oracle jdbc?

  4. Bagaimana cara mempertahankan BLOB BESAR (> 100MB) di Oracle menggunakan Hibernate

  5. Menambahkan nama Skema ke entitas di data Spring?