Oracle
 sql >> база данни >  >> RDS >> Oracle

Ред на изпълнение на условията в SQL клауза „къде“.

Сигурен ли си "нямате правомощията" да видите план за изпълнение? Какво ще кажете за използването на 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")

Както можете да видите, това дава доста подробности за това как ще бъде изпълнена заявката. Казва ми, че:

  • условието „emp.ename като „K%““ ще бъде приложено първо при пълното сканиране на EMP
  • тогава съвпадащите записи DEPT ще бъдат избрани чрез индекса на dept.deptno (чрез метода NESTED LOOPS)
  • най-накрая ще бъде приложен филтърът „dept.loc като „l%“.

Този ред на приложение няма нищо общо с начина, по който предикатите са подредени в клаузата WHERE, както можем да покажем с тази пренаредена заявка:

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. Използването на IS NULL или IS NOT NULL при условия на присъединяване - Теоретичен въпрос

  2. Как мога да се свържа със сървър на Oracle Database 11g чрез ssh тунелна верига (двоен тунел, сървър в мрежата на компанията)?

  3. ORA-04021:възникна изчакване при изчакване за заключване на обекта

  4. Поддържани модели на формат за функциите за дата ROUND() и TRUNC() в Oracle

  5. Преобразуване на дата в низ от Oracle