【DB笔试面试616】在Oracle中,和“消除”相关的查询转换有哪些?
- 2019 年 10 月 10 日
- 筆記
题目部分
在Oracle中,和“消除”相关的查询转换有哪些?
♣
答案部分
(一)排序消除
LHR@orclasm > SELECT COUNT(1) FROM ( SELECT T.EMPNO FROM SCOTT.EMP T ORDER BY T.EMPNO); COUNT(1) ---------- 14 Execution Plan ---------------------------------------------------------- Plan hash value: 96606410 ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 1 (0)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | | | | 2 | INDEX FULL SCAN| IDX_FULL_EMP_LHR | 14 | 1 (0)| 00:00:01 | ----------------------------------------------------------------------------- Statistics ---------------------------------------------------------- 47 recursive calls 5 db block gets 1 consistent gets 0 physical reads 2616 redo size 526 bytes sent via SQL*Net to client 519 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed
(二)去重消除
CREATE TABLE T_QC_20170613_LHR AS SELECT * FROM DBA_USERS; LHR@orclasm > SELECT DISTINCT T.USERNAME FROM T_QC_20170613_LHR T; Execution Plan ---------------------------------------------------------- Plan hash value: 1708573004 ---------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 58 | 986 | 4 (25)| 00:00:01 | | 1 | HASH UNIQUE | | 58 | 986 | 4 (25)| 00:00:01 | | 2 | TABLE ACCESS FULL| T_QC_20170613_LHR | 58 | 986 | 3 (0)| 00:00:01 | ---------------------------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement (level=2) Statistics ---------------------------------------------------------- 6 recursive calls 0 db block gets 9 consistent gets 1 physical reads 0 redo size 1710 bytes sent via SQL*Net to client 552 bytes received via SQL*Net from client 5 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 58 rows processed ALTER TABLE T_QC_20170613_LHR ADD PRIMARY KEY (USERNAME); LHR@orclasm > SELECT DISTINCT T.USERNAME FROM T_QC_20170613_LHR T; Execution Plan ---------------------------------------------------------- Plan hash value: 884813832 --------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 58 | 986 | 1 (0)| 00:00:01 | | 1 | INDEX FULL SCAN | SYS_C0089569 | 58 | 986 | 1 (0)| 00:00:01 | --------------------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement (level=2) Statistics ---------------------------------------------------------- 79 recursive calls 28 db block gets 83 consistent gets 0 physical reads 0 redo size 1710 bytes sent via SQL*Net to client 552 bytes received via SQL*Net from client 5 SQL*Net roundtrips to/from client 6 sorts (memory) 0 sorts (disk) 58 rows processed
(三)表消除
SELECT A.* FROM SCOTT.EMP A,SCOTT.DEPT B WHERE A.DEPTNO=B.DEPTNO; -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 14 | 1218 | 3 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| EMP | 14 | 1218 | 3 (0)| 00:00:01 | -------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("A"."DEPTNO" IS NOT NULL)
(四)公共子表达式消除(Common Sub-expression Elimination,CSE)
LHR@orclasm > SELECT * FROM SCOTT.EMP A,SCOTT.DEPT B WHERE ( A.DEPTNO=B.DEPTNO AND A.EMPNO<=7521) OR ( A.DEPTNO=B.DEPTNO AND A.EMPNO>=7782 ); --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 11 | 1287 | 7 (15)| 00:00:01 | |* 1 | HASH JOIN | | 11 | 1287 | 7 (15)| 00:00:01 | | 2 | TABLE ACCESS FULL| DEPT | 4 | 120 | 3 (0)| 00:00:01 | |* 3 | TABLE ACCESS FULL| EMP | 11 | 957 | 3 (0)| 00:00:01 | --------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - access("A"."DEPTNO"="B"."DEPTNO") 3 - filter("A"."EMPNO"<=7521 OR "A"."EMPNO">=7782) LHR@orclasm > ALTER SESSION SET "_ELIMINATE_COMMON_SUBEXPR"=FALSE; Session altered. LHR@orclasm > SELECT * FROM SCOTT.EMP A,SCOTT.DEPT B WHERE ( A.DEPTNO=B.DEPTNO AND A.EMPNO<=7521) OR ( A.DEPTNO=B.DEPTNO AND A.EMPNO>=7782 ); --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 117 | 10 (0)| 00:00:01 | | 1 | NESTED LOOPS | | 1 | 117 | 10 (0)| 00:00:01 | | 2 | TABLE ACCESS FULL| DEPT | 4 | 120 | 3 (0)| 00:00:01 | |* 3 | TABLE ACCESS FULL| EMP | 1 | 87 | 2 (0)| 00:00:01 | --------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - filter("A"."DEPTNO"="B"."DEPTNO" AND "A"."EMPNO"<=7521 OR "A"."DEPTNO"="B"."DEPTNO" AND "A"."EMPNO">=7782)
本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。