sql >> Database teknologi >  >> RDS >> Oracle

Udførelsesrækkefølge for betingelser i SQL 'where'-sætning

Er du sikker du "har ikke autoritet" til at se en udførelsesplan? Hvad med at bruge 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")

Som du kan se, giver det en hel del detaljer om, hvordan forespørgslen vil blive udført. Det fortæller mig, at:

  • betingelsen "emp.ename like 'K%'" vil blive anvendt først på den fulde scanning af EMP
  • så vil de matchende DEPT-poster blive valgt via indekset på dept.deptno (via NESTED LOOPS-metoden)
  • til sidst vil filteret "dept.loc som 'l%' blive anvendt.

Denne applikationsrækkefølge har intet at gøre med den måde, prædikaterne er ordnet i WHERE-sætningen, som vi kan vise med denne genbestillede forespørgsel:

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. Sådan sender du e-mails fra SQL Server (T-SQL)

  2. Kan du bruge et alias i WHERE-sætningen i mysql?

  3. MySQL FEJL 1045 (28000):Adgang nægtet for brugeren 'bill'@'localhost' (ved hjælp af adgangskode:JA)

  4. connection.select_value returnerer kun strenge i postgres med pg gem