【书评:Oracle查询优化改写】第三章

BLOG文档结构图

 

 

 

  1. 导读

各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~:

① 隐含参数 _b_tree_bitmap_plans介绍

② 11g新特性Native Full Outer Join

 

 

 

本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力。

  1. 实验环境介绍

 

oracle:11.2.0.3 、8.1.7.0.0

OS: RHEL6.5

 

  1. 前言

 

前2章的链接参考相关连接:

 

【书评:Oracle查询优化改写】第一章 http://blog.itpub.net/26736162/viewspace-1652985/

【书评:Oracle查询优化改写】第二章http://blog.itpub.net/26736162/viewspace-1654252/

 

 

昨天晚上(5.14)看完了《Oracle查询优化改写》的第三章,不得不说下这本书里边代码的排版有很大问题,格式老是不对齐,尤其是执行计划的格式,可能是印刷的时候出现的问题吧,不说这个了。这个第三章主要是讲多表的关联,包括各种连接的写法,如左联、右联,以及过滤条件错误地放在WHERE里会有什么影响;当数据有重复值时要直接关联还是分组汇总后再关联。

 

第 3 章 操作多个表

3.1 UNION ALL 与空字符串

3.2 UNION 与 OR

3.3 组合相关的行

3.4 IN、EXISTS 和 INNER JOIN

3.5 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN 解析

3.6 自关联

3.7 NOT IN、NOT EXISTS 和 LEFT JOIN

3.8 外连接中的条件不要乱放

3.9 检测两个表中的数据及对应数据的条数是否相同

3.10 聚集与内连接

3.11 聚集与外连接

3.12 从多个表中返回丢失的数据

3.13 多表查询时的空值处理

 

 

下边我就针对一些重点,或者说是我自己也不是很懂的部分做做研究吧。

 

  1. 隐含参数 _b_tree_bitmap_plans 实验

 

  1. 简介

该参数为隐含参数,是指是否将索引转换为bitmap索引然后执行,在oracle9i之前默认值为false,之后的默认值为true。可以这样认为,如有两个字段A,B都有btree索引,oracle有可能将这两个索引转换成bitmap索引然后做and操作得出结果集。如果改为false就会选用其中的一个索引,走btree的索引,我们可以将该参数在session或系统级别设置为false,也可以加hint /*+ opt_param('_b_tree_bitmap_plans', 'false') */ 来实现禁用该参数。


symptom: Execution plan operation shows bitmap conversion from rowids


symptom: No bitmap indexes


symptom: Execution plan shows BITMAP CONVERSION


cause: In 7.3.4 and in 8.1.7 default value of _b_tree_bitmap_plans is FALSE
whereas as of 9.0.1 (and 9.2) the default value is TRUE When _b_tree_bitmap_plans set to true (advice not to change the default setting
yourself) the optimizer is allowed to produce bitmap plans for normal b*tree
indexes even if no bitmap indexes set.

 

相关的执行计划中可能转换为如下的形式:

)BITMAP CONVERSION FROM ROWIDS

将一批数据记录的ROWID映射为位图。

对于普通B*树索引,Oracle也可以将数据记录的ROWID映射成一个位图,然后进行位图操作。进行这样的转换需要将系统参数_b_tree_bitmap_plans设置为TRUE。

)BITMAP CONVERSION TO ROWIDS

将位图映射为ROWID。在一个位图键值中,包含了一批数据记录的起始地址和结束地址,且这批记录是连续的,因此位图中的每一个位就按序对应了一条数据记录。

 

)BITMAP OR

对位图进行"或"(OR)操作。在查询的过滤条件中,如果位图索引字段直接的关系是"或",可以通过BITMAP OR来判断位图所映射的一批数据记录是否满足条件。

 

 

eygle大师的一个例子:

http://www.eygle.com/archives/2011/12/bitmap_conversion_cpu.html

 

 

 

  1. 11g情况下

 

[root@rhel6_lhr ~]# su - oracle

[oracle@rhel6_lhr ~]$ sqlplus / as sysdba

 

SQL*Plus: Release 11.2.0.3.0 Production on Fri May 10:16:10 2015

 

Copyright (c) 1982, 2011, Oracle. All rights reserved.

 

 

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

With the Partitioning, Automatic Storage Management, OLAP, Data Mining

and Real Application Testing options

 

10:16:10 SQL>

 

10:16:10 SQL> conn lhr/lhr

Connected.

 

10:16:10 SQL> create table emp_bk as select * from scott.emp;

Table created.

 

Elapsed: 00:00:03.43

 

10:16:15 SQL> create index idx_emp_empno on emp_bk(empno);

 

Index created.

 

Elapsed: 00:00:00.05

10:19:26 SQL> create index idx_emp_ename on emp_bk(ename);

 

Index created.

 

Elapsed: 00:00:00.04

 

 

10:20:48 SQL> explain plan for select empno,ename from emp_bk where empno=7788 or ename='SCOTT';

 

Explained.

 

Elapsed: 00:00:00.09

10:20:56 SQL> select * from table(dbms_xplan.display);

 

 

PLAN_TABLE_OUTPUT

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Plan hash value: 4193090541

 

--------------------------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

--------------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | 20 | 2 (0)| 00:00:01 |

| 1 | TABLE ACCESS BY INDEX ROWID | EMP_BK | 1 | 20 | 2 (0)| 00:00:01 |

| 2 | BITMAP CONVERSION TO ROWIDS | | | | | |

| 3 | BITMAP OR | | | | | |

| 4 | BITMAP CONVERSION FROM ROWIDS| | | | | |

|* 5 | INDEX RANGE SCAN | IDX_EMP_EMPNO | | | 1 (0)| 00:00:01 |

| 6 | BITMAP CONVERSION FROM ROWIDS| | | | | |

|* 7 | INDEX RANGE SCAN | IDX_EMP_ENAME | | | 1 (0)| 00:00:01 |

--------------------------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

5 - access("EMPNO"=7788)

7 - access("ENAME"='SCOTT')

 

Note

-----

- dynamic sampling used for this statement (level=2)

 

24 rows selected.

 

Elapsed: 00:00:00.52

 

10:24:06 SQL> conn / as sysdba

Connected.

 

Elapsed: 00:00:00.03

10:24:34 SQL> set pagesize 9999

10:24:41 SQL> set line 9999

10:24:41 SQL> col NAME format a30

10:24:41 SQL> col KSPPDESC format a50

10:24:41 SQL> col KSPPSTVL format a20

10:24:42 SQL> SELECT a.INDX,

10:24:42 2 a.KSPPINM NAME,

10:24:42 3 a.KSPPDESC,

10:24:42 4 b.KSPPSTVL

10:24:42 5 FROM x$ksppi a,

10:24:42 6 x$ksppcv b

10:24:42 7 WHERE a.INDX = b.INDX

10:24:42 8 and lower(a.KSPPINM) like lower('%&parameter%');

Enter value for parameter: _b_tree_bitmap_plans

old 8: and lower(a.KSPPINM) like lower('%&parameter%')

new 8: and lower(a.KSPPINM) like lower('%_b_tree_bitmap_plans%')

 

INDX NAME KSPPDESC KSPPSTVL

---------- ------------------------------ -------------------------------------------------- --------------------

1910 _b_tree_bitmap_plans enable the use of bitmap plans for tables w. only TRUE

B-tree indexes

 

 

Elapsed: 00:00:00.01

 

10:25:44 SQL> conn lhr/lhr

Connected.

 

10:26:56 SQL> alter session set "_b_tree_bitmap_plans" = false;

 

Session altered.

 

Elapsed: 00:00:00.00

10:27:01 SQL> show parameter _b_tree_bitmap_plans

 

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

_b_tree_bitmap_plans boolean FALSE

10:27:05 SQL> explain plan for select empno,ename from emp_bk where empno=7788 or ename='SCOTT';

 

Explained.

 

Elapsed: 00:00:00.01

10:27:14 SQL> select * from table(dbms_xplan.display);

 

PLAN_TABLE_OUTPUT

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Plan hash value: 370270337

 

----------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

----------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | 20 | 3 (0)| 00:00:01 |

|* 1 | TABLE ACCESS FULL| EMP_BK | 1 | 20 | 3 (0)| 00:00:01 |

----------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

1 - filter("EMPNO"=7788 OR "ENAME"='SCOTT')

 

Note

-----

- dynamic sampling used for this statement (level=2)

 

17 rows selected.

 

Elapsed: 00:00:00.04

10:27:18 SQL> explain plan for select empno,ename from emp_bk where empno=7788

10:27:49 2 union

10:27:55 3 select empno,ename from emp_bk where ename='SCOTT';

 

Explained.

 

Elapsed: 00:00:00.00

10:28:07 SQL> select * from table(dbms_xplan.display);

 

PLAN_TABLE_OUTPUT

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Plan hash value: 3014579657

 

-----------------------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

-----------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 2 | 40 | 6 (67)| 00:00:01 |

| 1 | SORT UNIQUE | | 2 | 40 | 6 (67)| 00:00:01 |

| 2 | UNION-ALL | | | | | |

| 3 | TABLE ACCESS BY INDEX ROWID| EMP_BK | 1 | 20 | 2 (0)| 00:00:01 |

|* 4 | INDEX RANGE SCAN | IDX_EMP_EMPNO | 1 | | 1 (0)| 00:00:01 |

| 5 | TABLE ACCESS BY INDEX ROWID| EMP_BK | 1 | 20 | 2 (0)| 00:00:01 |

|* 6 | INDEX RANGE SCAN | IDX_EMP_ENAME | 1 | | 1 (0)| 00:00:01 |

-----------------------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

4 - access("EMPNO"=7788)

6 - access("ENAME"='SCOTT')

 

Note

-----

- dynamic sampling used for this statement (level=2)

 

23 rows selected.

 

Elapsed: 00:00:00.01

10:28:13 SQL> Select Name ,Value From v$parameter Where Name ='_b_tree_bitmap_plans' ;

 

NAME VALUE

------------------------------ ---------------------------------------------------------------

_b_tree_bitmap_plans FALSE

 

Elapsed: 00:00:00.02

10:34:06 SQL> alter session set "_b_tree_bitmap_plans" = true;

 

Session altered.

 

Elapsed: 00:00:00.00

 

11:19:04 SQL> explain plan for select /*+ opt_param('_b_tree_bitmap_plans', 'false') */ empno,ename from emp_bk where empno=7788 or ename='SCOTT';

 

Explained.

 

Elapsed: 00:00:00.08

11:19:22 SQL> select * from table(dbms_xplan.display);

 

PLAN_TABLE_OUTPUT

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Plan hash value: 370270337

 

----------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

----------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | 20 | 3 (0)| 00:00:01 |

|* 1 | TABLE ACCESS FULL| EMP_BK | 1 | 20 | 3 (0)| 00:00:01 |

----------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

1 - filter("EMPNO"=7788 OR "ENAME"='SCOTT')

 

Note

-----

- dynamic sampling used for this statement (level=2)

 

17 rows selected.

 

Elapsed: 00:00:00.24

 

由实验可以看出,_b_tree_bitmap_plans设置为false后,emp_bk走了全表扫描,并没有走位图索引转换。

 

 

  1. 8i情况下

C:\Users\Administrator>sqlplus "lhr/lhr@orcl8i as sysdba"

 

SQL*Plus: Release 8.1.7.0.0 - Production on Mon May 18 10:44:28 2015

 

(c) Copyright 2000 Oracle Corporation. All rights reserved.

 

 

Connected to:

Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production

With the Partitioning option

JServer Release 8.1.7.0.0 - Production

 

SQL> set pagesize 9999

SQL> set line 9999

SQL> col NAME format a30

SQL> col KSPPDESC format a50

SQL> col KSPPSTVL format a20

SQL> SELECT a.INDX,

2 a.KSPPINM NAME,

3 a.KSPPDESC,

4 b.KSPPSTVL

5 FROM x$ksppi a,

6 x$ksppcv b

7 WHERE a.INDX = b.INDX

8 and lower(a.KSPPINM) like lower('%&parameter%');

Enter value for parameter: _b_tree_bitmap_plans

old 8: and lower(a.KSPPINM) like lower('%&parameter%')

new 8: and lower(a.KSPPINM) like lower('%_b_tree_bitmap_plans%')

 

INDX NAME KSPPDESC KSPPSTVL

---------- ------------------------------ -------------------------------------------------- --------------------

348 _b_tree_bitmap_plans enable the use of bitmap plans for tables w. only FALSE

B-tree indexes

 

 

SQL>

 

 

 

SQL> create table lhr.emp_bk as select * from scott.emp;

 

Table created.

 

SQL> create index lhr.idx_emp_empno on lhr.emp_bk(empno);

 

Index created.

 

SQL> create index lhr.idx_emp_ename on lhr.emp_bk(ename);

 

Index created.

 

SQL> set line 9999 pagesize 9999

SQL> set autot on;

SQL> select empno,ename from lhr.emp_bk where empno=7788 or ename='SCOTT';

 

EMPNO ENAME

---------- ----------

7788 SCOTT

 

 

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 CONCATENATION

2 1 TABLE ACCESS (BY INDEX ROWID) OF 'EMP_BK'

3 2 INDEX (RANGE SCAN) OF 'IDX_EMP_ENAME' (NON-UNIQUE)

4 1 TABLE ACCESS (BY INDEX ROWID) OF 'EMP_BK'

5 4 INDEX (RANGE SCAN) OF 'IDX_EMP_EMPNO' (NON-UNIQUE)

 

 

 

 

Statistics

----------------------------------------------------------

0 recursive calls

0 db block gets

0 consistent gets

0 physical reads

0 redo size

0 bytes sent via SQL*Net to client

0 bytes received via SQL*Net from client

0 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

1 rows processed

 

SQL>

 

 

8i下默认为false,执行计划也完全不同。

 

 

  1. Native Full Outer Join

 

关于这个特性可以参考如下文章:

 

http://blog.itpub.net/26736162/viewspace-1660038/

 

我们在10.2.0.4下测试一下:

 

 

[oracle@rhel6_lhr ~]$ sqlplus / as sysdba

 

SQL*Plus: Release 10.2.0.4.0 - Production on Mon May 18 11:41:13 2015

 

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.

 

Connected to an idle instance.

 

SQL> startup

ORACLE instance started.

 

Total System Global Area 448790528 bytes

Fixed Size 2084616 bytes

Variable Size 121635064 bytes

Database Buffers 318767104 bytes

Redo Buffers 6303744 bytes

Database mounted.

Database opened.

 

SQL> create table lhr.emp_bk as select * from scott.emp;

 

Table created.

 

SQL> create table lhr.emp_bk as select * from scott.emp;

 

Table created.

 

SQL> set autot on;

SQL> set line 9999 pagesize 9999

SQL> select * from lhr.emp_bk a full outer join lhr.emp_bk2 b on a.empno=b.empno;

 

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

---------- ---------- --------- ---------- ------------------- ---------- ---------- ---------- ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------

7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20 7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20

7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30 7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30

7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30 7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30

7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20 7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20

7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30 7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30

7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30 7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30

7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10 7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10

7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20 7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20

7839 KING PRESIDENT 1981-11-17 00:00:00 5000 10 7839 KING PRESIDENT 1981-11-17 00:00:00 5000 10

7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30 7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30

7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20 7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20

7900 JAMES CLERK 7698 1981-12-03 00:00:00 950 30 7900 JAMES CLERK 7698 1981-12-03 00:00:00 950 30

7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000 20 7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000 20

7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300 10 7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300 10

 

14 rows selected.

 

 

Execution Plan

----------------------------------------------------------

Plan hash value: 914601651

 

--------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

--------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 15 | 2610 | 13 (8)| 00:00:01 |

| 1 | VIEW | | 15 | 2610 | 13 (8)| 00:00:01 |

| 2 | UNION-ALL | | | | | |

|* 3 | HASH JOIN OUTER | | 14 | 2436 | 7 (15)| 00:00:01 |

| 4 | TABLE ACCESS FULL| EMP_BK | 14 | 1218 | 3 (0)| 00:00:01 |

| 5 | TABLE ACCESS FULL| EMP_BK2 | 14 | 1218 | 3 (0)| 00:00:01 |

|* 6 | HASH JOIN ANTI | | 1 | 100 | 7 (15)| 00:00:01 |

| 7 | TABLE ACCESS FULL| EMP_BK2 | 14 | 1218 | 3 (0)| 00:00:01 |

| 8 | TABLE ACCESS FULL| EMP_BK | 14 | 182 | 3 (0)| 00:00:01 |

--------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

3 - access("A"."EMPNO"="B"."EMPNO"(+))

6 - access("A"."EMPNO"="B"."EMPNO")

 

Note

-----

- dynamic sampling used for this statement

 

 

Statistics

----------------------------------------------------------

338 recursive calls

0 db block gets

61 consistent gets

6 physical reads

0 redo size

2521 bytes sent via SQL*Net to client

492 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

4 sorts (memory)

0 sorts (disk)

14 rows processed

 

SQL> select /*+ NATIVE_FULL_OUTER_JOIN */ * from lhr.emp_bk a full outer join lhr.emp_bk2 b on a.empno=b.empno;

 

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

---------- ---------- --------- ---------- ------------------- ---------- ---------- ---------- ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------

7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20 7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20

7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30 7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30

7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30 7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30

7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20 7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20

7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30 7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30

7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30 7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30

7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10 7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10

7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20 7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20

7839 KING PRESIDENT 1981-11-17 00:00:00 5000 10 7839 KING PRESIDENT 1981-11-17 00:00:00 5000 10

7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30 7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30

7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20 7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20

7900 JAMES CLERK 7698 1981-12-03 00:00:00 950 30 7900 JAMES CLERK 7698 1981-12-03 00:00:00 950 30

7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000 20 7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000 20

7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300 10 7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300 10

 

14 rows selected.

 

 

Execution Plan

----------------------------------------------------------

Plan hash value: 2812081866

 

----------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

----------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 14 | 2436 | 7 (15)| 00:00:01 |

| 1 | VIEW | VW_FOJ_0 | 14 | 2436 | 7 (15)| 00:00:01 |

|* 2 | HASH JOIN FULL OUTER| | 14 | 2436 | 7 (15)| 00:00:01 |

| 3 | TABLE ACCESS FULL | EMP_BK | 14 | 1218 | 3 (0)| 00:00:01 |

| 4 | TABLE ACCESS FULL | EMP_BK2 | 14 | 1218 | 3 (0)| 00:00:01 |

----------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

2 - access("A"."EMPNO"="B"."EMPNO")

 

Note

-----

- dynamic sampling used for this statement

 

 

Statistics

----------------------------------------------------------

7 recursive calls

0 db block gets

15 consistent gets

0 physical reads

0 redo size

2521 bytes sent via SQL*Net to client

492 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

2 sorts (memory)

0 sorts (disk)

14 rows processed

 

SQL> set pagesize 9999

SQL> set line 9999

SQL> col NAME format a40

SQL> col KSPPDESC format a50

SQL> col KSPPSTVL format a20

SQL> SELECT a.INDX,

2 a.KSPPINM NAME,

3 a.KSPPDESC,

4 b.KSPPSTVL

5 FROM x$ksppi a,

6 x$ksppcv b

7 WHERE a.INDX = b.INDX

8 and lower(a.KSPPINM) like lower('%&parameter%');

Enter value for parameter: optimizer_native_full_outer_join

old 8: and lower(a.KSPPINM) like lower('%&parameter%')

new 8: and lower(a.KSPPINM) like lower('%optimizer_native_full_outer_join%')

 

INDX NAME KSPPDESC KSPPSTVL

---------- ------------------------------ -------------------------------------------------- --------------------

1318 _optimizer_native_full_outer_j execute full outer join using native implementaion off

oin

 

 

SQL>

 

 

  1. 多表查询时候的null值处理

 

我们在第一篇(http://blog.itpub.net/26736162/viewspace-1652985/)中总结了一下null值特征,今天我们再来看一下多表查询的时候null值得处理。

  1. 情形一:

若子查询中的结果中包含null值,那么not in(null、xx、bb、cc)返回为空。

 

[oracle@rhel6_lhr ~]$ sqlplus / as sysdba

 

SQL*Plus: Release 11.2.0.3.0 Production on Mon May 18 13:38:09 2015

 

Copyright (c) 1982, 2011, Oracle. All rights reserved.

 

 

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

With the Partitioning, Automatic Storage Management, OLAP, Data Mining

and Real Application Testing options

 

13:38:09 SQL> drop table lhr.emp_bk;

 

Table dropped.

 

Elapsed: 00:00:04.16

13:38:15 SQL> create table lhr.emp_bk as select * from scott.emp;

 

Table created.

 

Elapsed: 00:00:00.77

13:41:01 SQL> create table lhr.dept_bk as select * from scott.dept;

 

Table created.

 

Elapsed: 00:00:00.13

13:41:43 SQL> insert into lhr.dept_bk values(50,'lhr','China');

 

1 row created.

 

Elapsed: 00:00:00.03

13:41:57 SQL> select * from lhr.dept_bk ;

 

DEPTNO DNAME LOC

---------- -------------- -------------

10 ACCOUNTING NEW YORK

20 RESEARCH DALLAS

30 SALES CHICAGO

40 OPERATIONS BOSTON

50 lhr China

 

Elapsed: 00:00:00.01

13:42:48 SQL> select * from lhr.emp_bk b;

 

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------

7369 SMITH CLERK 7902 1980-12-17 00:00:00 20800 20

7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 31600 300 30

7521 WARD SALESMAN 7698 1981-02-22 00:00:00 31250 500 30

7566 JONES MANAGER 7839 1981-04-02 00:00:00 22975 20

7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 31250 1400 30

7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 32850 30

7782 CLARK MANAGER 7839 1981-06-09 00:00:00 12450 10

7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 23000 20

7839 KING PRESIDENT 1981-11-17 00:00:00 15000 10

7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 31500 0 30

7876 ADAMS CLERK 7788 1987-05-23 00:00:00 21100 20

7900 JAMES CLERK 7698 1981-12-03 00:00:00 30950 30

7902 FORD ANALYST 7566 1981-12-03 00:00:00 23000 20

7934 MILLER CLERK 7782 1982-01-23 00:00:00 11300 10

 

16 rows selected.

 

Elapsed: 00:00:00.02

13:44:00 SQL> select * from lhr.dept_bk a where a.deptno not in(select b.deptno from lhr.emp_bk b);

 

DEPTNO DNAME LOC

---------- -------------- -------------

50 lhr China

40 OPERATIONS BOSTON

 

Elapsed: 00:00:00.93

13:44:07 SQL> update lhr.emp_bk b set b.deptno=null where empno=7788;

 

1 row updated.

 

Elapsed: 00:00:00.04

13:45:17 SQL> select * from lhr.emp_bk b;

 

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------

7369 SMITH CLERK 7902 1980-12-17 00:00:00 20800 20

7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 31600 300 30

7521 WARD SALESMAN 7698 1981-02-22 00:00:00 31250 500 30

7566 JONES MANAGER 7839 1981-04-02 00:00:00 22975 20

7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 31250 1400 30

7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 32850 30

7782 CLARK MANAGER 7839 1981-06-09 00:00:00 12450 10

7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 23000

7839 KING PRESIDENT 1981-11-17 00:00:00 15000 10

7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 31500 0 30

7876 ADAMS CLERK 7788 1987-05-23 00:00:00 21100 20

7900 JAMES CLERK 7698 1981-12-03 00:00:00 30950 30

7902 FORD ANALYST 7566 1981-12-03 00:00:00 23000 20

7934 MILLER CLERK 7782 1982-01-23 00:00:00 11300 10

 

14 rows selected.

 

Elapsed: 00:00:00.14

13:45:23 SQL> select * from lhr.dept_bk a where a.deptno not in(select b.deptno from lhr.emp_bk b);

 

no rows selected

 

Elapsed: 00:00:00.00

13:45:39 SQL> select * from lhr.dept_bk a where a.deptno not in(select b.deptno from lhr.emp_bk b where b.deptno is not null);

 

DEPTNO DNAME LOC

---------- -------------- -------------

50 lhr China

40 OPERATIONS BOSTON

 

Elapsed: 00:00:00.04

13:46:01 SQL>

  1. 情形二:

要求返回所有比"ALLEN"提成低的员工:

 

14:01:07 SQL> select a.ename,a.comm from scott.emp a;

 

ENAME COMM

---------- ----------

SMITH

ALLEN 300

WARD 500

JONES

MARTIN 1400

BLAKE

CLARK

SCOTT

KING

TURNER 0

ADAMS

JAMES

FORD

MILLER

 

14 rows selected.

 

Elapsed: 00:00:00.23

14:01:17 SQL> select a.ename,a.comm from scott.emp a where a.comm < ( select b.comm from scott.emp b where b.ename='ALLEN');

 

ENAME COMM

---------- ----------

TURNER 0

 

Elapsed: 00:00:00.11

14:01:28 SQL> select a.ename,a.comm from scott.emp a where coalesce(a.comm,0) < ( select b.comm from scott.emp b where b.ename='ALLEN');

 

ENAME COMM

---------- ----------

SMITH

JONES

BLAKE

CLARK

SCOTT

KING

TURNER 0

ADAMS

JAMES

FORD

MILLER

 

11 rows selected.

 

Elapsed: 00:00:00.02

14:01:55 SQL>

 

 

  1. 总结

 

到此个人觉得本章的一些难点或需要补充的地方就这些了,希望大家看完有所收获。

 

 

 

  1. about me

 

...........................................................................................................................................................................................

本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

ITPUB BLOG:http://blog.itpub.net/26736162

本文地址:http://blog.itpub.net/26736162/viewspace-1660422/

本文pdf版:http://yunpan.cn/QCwUAI9bn7g7w
提取码:af2d

QQ:642808185 若加QQ请注明你所正在读的文章标题

创作时间地点:2015-05-15 10:00~ 2015-05-18 15:00 于外汇交易中心

<版权所有,文章允许转载,但须以链接方式注明源地址,否则追究法律责任!>

...........................................................................................................................................................................................

 

【书评:Oracle查询优化改写】第三章的更多相关文章

  1. 【书评:Oracle查询优化改写】第二章

    [书评:Oracle查询优化改写]第二章 BLOG文档结构图 在上一篇中http://blog.itpub.net/26736162/viewspace-1652985/,我们主要分析了一些单表查询的 ...

  2. 【书评:Oracle查询优化改写】第14章 结尾章

    [书评:Oracle查询优化改写]第14章 结尾章 一.1  相关参考文章链接 前13章的链接参考相关连接: [书评:Oracle查询优化改写]第一章 http://blog.itpub.net/26 ...

  3. 【书评:Oracle查询优化改写】第五至十三章

    [书评:Oracle查询优化改写]第五至十三章 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知 ...

  4. 【书评:Oracle查询优化改写】第四章

    [书评:Oracle查询优化改写]第四章 BLOG文档结构图 一.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① check的 ...

  5. oracle 查询优化改写

    -----------书籍: oracle 查询优化改写-----------第1个“C###oracle”为登录数据库的用户名,第2个“oracleChange”为登录数据库的密码“oracleCh ...

  6. 《Oracle查询优化改写技巧与案例》学习笔记-------使用数字篇

    一个系列的读书笔记,读的书是有教无类和落落两位老师编写的<Oracle查询优化改写技巧与案例>. 用这个系列的读书笔记来督促自己学习Oracle,同时,对于其中一些内容,希望大家看到以后, ...

  7. 《 Oracle查询优化改写 技巧与案例 》电子工业出版社

    第1章单表查询 11.1 查询表中所有的行与列 11.2 从表中检索部分行 21.3 查找空值 31.4 将空值转换为实际值 41.5 查找满足多个条件的行 51.6 从表中检索部分列 61.7 为列 ...

  8. Oracle查询优化改写--------------------高级查询

    一.给结果集分页 二.重新生成房间号 三.跳过表中n行 四.排列组合去重

  9. Oracle查询优化改写--------------------操作多个表

    一.union all与空字符串 二.组合相关行 三.in .exists.inter join .left join .right join .full join 之间的区别 'inner  joi ...

随机推荐

  1. Annotation-based argument resolution 部分2

    HandlerMethodArgumentResolver的抽象實現AbstractNamedValueMethodArgumentResolver下的子类  部分1 RequestParamMapM ...

  2. weui.js汉字乱码

    2019-6-25 11:04:13 星期二 min.js 源文件中会自带乱码: 鍙栨秷:  取消; 纭畾:   确定; 方案: 把weui.js用notepad++打开, 搜索乱码字符, 替换掉, ...

  3. dotnet core 3.0 swagger 显示枚举描述

    上一篇net core 2.2 swagger的枚举描述,core 3.0 需要升级swagger到5.0rc版,配置需要做些修改,swaager启用了OpenApi标准,之前的枚举描述方法也失效了. ...

  4. (转)mysql使用Navicat 导出和导入数据库

    mysql使用Navicat 导出和导入数据库 ps:在导入本地数据库的时候,要先建立相同的数据库,然后再运行sql文件,即可导入相应的数据库

  5. SpringBoot系列教程web篇之过滤器Filter使用指南

    web三大组件之一Filter,可以说是很多小伙伴学习java web时最早接触的知识点了,然而学得早不代表就用得多.基本上,如果不是让你从0到1写一个web应用(或者说即便从0到1写一个web应用) ...

  6. Ubuntu下载源码并编译

    本文章将介绍如何在Ubunt下进行Linux源码下载,并进行简单的编译步骤. 1.下载linux源码 先查看对应的Ubuntu对应版本源码 $ sudo apt-cache search linux- ...

  7. 直击JavaScript之面向对象

    有时候,我们使用电脑的时候,并不知道它的原理是什么,但是就是会使用他,这就是面向对象.同样的,在JavaScript中也可使用这种原理,接下来就随我一起探索一下关于JavaScript面向对象的内容吧 ...

  8. LeetCode 1089. 复写零(Duplicate Zeros) 72

    1089. 复写零 1089. Duplicate Zeros 题目描述 给你一个长度固定的整数数组 arr,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移. 注意:请不要在超过该数组长 ...

  9. LeetCode 453. 最小移动次数使数组元素相等(Minimum Moves to Equal Array Elements) 47

    453. 最小移动次数使数组元素相等 453. Minimum Moves to Equal Array Elements 题目描述 给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移 ...

  10. 嵌入式02 STM32 实验05 蜂鸣器

    蜂鸣器:是一种一体化结构的电子讯响器.主要分为分压式蜂鸣器和电磁式蜂鸣器两种类型. 一.有源/无源蜂鸣器(不是指是否带电源,而是有没有自带震荡电路) 1.有源蜂鸣器:有源蜂鸣器自带震荡电路,一通电就会 ...