Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Thứ tự thực thi các điều kiện trong mệnh đề SQL 'where'

Bạn có chắc chắn không bạn "không có thẩm quyền" để xem một kế hoạch thực hiện? Còn việc sử dụng AUTOTRACE thì sao?

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")

Như bạn có thể thấy, điều đó cung cấp khá nhiều chi tiết về cách truy vấn sẽ được thực thi. Nó cho tôi biết rằng:

  • điều kiện "tên trống như 'K%'" sẽ được áp dụng đầu tiên, khi quét toàn bộ EMP
  • sau đó các bản ghi DEPT phù hợp sẽ được chọn thông qua chỉ mục trên dept.deptno (thông qua phương thức NESTED LOOPS)
  • cuối cùng bộ lọc "dept.loc như 'l%' sẽ được áp dụng.

Thứ tự áp dụng này không liên quan gì đến cách sắp xếp các vị từ trong mệnh đề WHERE, như chúng ta có thể hiển thị với truy vấn được sắp xếp lại này:

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. KIỂM TRA CONSTRAINT của chuỗi chỉ chứa các chữ số. (Oracle SQL)

  2. Cách định dạng số dưới dạng chữ số La mã trong Oracle

  3. Có thể chuyển tên bảng làm tham số trong Oracle không?

  4. Cách định dạng ngày trong Oracle

  5. Chèn và cập nhật dựa trên bản ghi trong Oracle