设为首页收藏本站

无忧软考论坛|信息系统项目管理师|系统集成项目管理工程师考试全程辅导培训资料

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3724|回复: 2

数据库工程师谈谈驱动表的写法及规则

  [复制链接]

3658

主题

0

好友

7万

积分

管理员

C哥|CD

Rank: 9Rank: 9Rank: 9

发表于 2012-1-13 23:57:59 |显示全部楼层
驱动表普遍认为是由SQL语句的写法决定的,简单的说,就是FROM语句后面的表列表中的最后一个。由于SQL语句是从后向前进行分析,Oracle会根据FROM语句从后到前将各个表依次连接起来。
  SQL> CREATE TABLE T1 AS SELECT * FROM USER_TABLES;

  表已创建。

  SQL> CREATE TABLE T2 AS SELECT * FROM USER_INDEXES;

  表已创建。

  SQL> SET AUTOT ON EXP
  SQL> SELECT COUNT(*) FROM T1, T2
  2 WHERE T1.TABLE_NAME = T2.TABLE_NAME;
  COUNT(*)
  ----------
  Execution Plan
  ----------------------------------------------------------
  0 SELECT STATEMENT ptimizer=CHOOSE
  1 0 SORT (AGGREGATE)
  2 1 MERGE JOIN2 k2 I)
  3 2 SORT (JOIN)
  4 3 TABLE ACCESS (FULL) OF 'T2'
  5 2 SORT (JOIN)
  6 5 TABLE ACCESS (FULL) OF 'T1'
  SQL> SELECT COUNT(*) FROM T2, T1
  2 WHERE T1.TABLE_NAME = T2.TABLE_NAME;
  COUNT(*)
  ----------
  37
  Execution Plan
  ----------------------------------------------------------
  0 SELECT STATEMENT ptimizer=CHOOSE
  1 0 SORT (AGGREGATE)
  2 1 MERGE JOIN
  3 2 SORT (JOIN)
  4 3 TABLE ACCESS (FULL) OF 'T1'
  5 2 SORT (JOIN)
  6 5 TABLE ACCESS (FULL) OF 'T2'

  根据这个例子,可以看出,SQL语句的写法对于驱动表的影响。

  然而,实际上驱动表和连接顺序的选择要比上面的观点复杂的多,下面对稍微调整一下这个例子。

  SQL> ALTER TABLE T1 ADD CONSTRAINT PK_T1 PRIMARY KEY (TABLE_NAME);

  表已更改

  SQL> SELECT COUNT(*) FROM T1, T2
  2 WHERE T1.TABLE_NAME = T2.TABLE_NAME;
  COUNT(*)

----------  37
  Execution Plan
  --------------------------------------0 SELECT STATEMENT ptimizer=CHOOSE
  1 0 SORT (AGGREGATE)
  2 1 NESTED LOOPS
  3 2 TABLE ACCESS (FULL) OF 'T2'
  4 2 INDEX (UNIQUE SCAN) OF 'PK_T1' (UNIQUE)
  SQL> SELECT COUNT(*) FROM T2, T1
  2 WHERE T1.TABLE_NAME = T2.TABLE_NAME;
  COUNT(*)
  ----------
  37
  Execution Plan
  0 SELECT STATEMENT ptimizer=CHOOSE
  1 0 SORT (AGGREGATE)
  2 1 NESTED LOOPS
  3 2 TABLE ACCESS (FULL) OF 'T2'
  4 2 INDEX (UNIQUE SCAN) OF 'PK_T1' (UNIQUE)

  仅仅是给T1增加了一个主键,就发现不管SQL语句怎么写驱动表都是T2。

  即使是RBO,确定表连接顺序的规则也是比较复杂的:

  ①优化器产生一系列连接顺序,每次均把不同的表作为驱动表。而且,优化器根据下面的算法产生每个连接顺序。

  为了确定连接顺序中各个表的位置,优化器根据RBO执行计划的排名,在剩余的表中找到表访问路径排名最高的表,然后不断的重复这个过程,依次确定连接顺序中每个表的前后顺序。

  对于连接顺序中的每张表,优化器根据执行计划的排名选择一种连接方式将当前表和前面的表或数据源连接在一起。

  ②优化器在执行计划的结果集中进行选择。优化器的目标是最大程度的选择内部表采用索引扫描方式的NESTED LOOPS连接操作。

  通常情况下,优化器在选择执行计划时,不会考虑表在FROM语句中出现的顺序。优化器依次根据下面的规则来作出选择。

  优化器选择执行计划使得内部表为全表扫描的NESTED LOOPS连接尽可能的少;

  如果采用上面的条件出现了平局的情况,则优化器选择尽可能少出现SORT MERGE操作的执行计划;

  如果仍然出现平局的情况,则优化器将选择表访问路径中排名最高的表作为驱动表;

  如果这时仍然是平局,则优化器会把FROM语句中最后出现的表最为驱动表。
回复

使用道具 举报

印刷880825 该用户已被删除
发表于 2015-8-29 01:01:11 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

{循环水管} 该用户已被删除
发表于 2015-11-12 06:44:56 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|专注于信息系统项目管理师|系统集成项目管理工程师考试全程辅导培训视频资料 ( 网警备案:420100007573  

GMT+8, 2020-9-19 01:35 , Processed in 0.110421 second(s), 35 queries .

Powered by 91过软考教育学院,QQ:858301448 电话18008622883 X2.5 & 考试中心 Exam2.0

© 2001-2012 Comsenz Inc.

回顶部