楼主: nyfor

烦请解释一下“驱动表”的概念

[复制链接]
论坛徽章:
4
ITPUB元老
日期:2005-04-26 14:47:45授权会员
日期:2005-10-30 17:05:33管理团队2006纪念徽章
日期:2006-04-16 22:44:45会员2006贡献徽章
日期:2006-04-17 13:46:34
11#
发表于 2003-7-28 09:23 | 只看该作者
fly115 说“对于基于规则的优化系统,驱动表在FROM后是有次序设置的”,
而jhc_hn 说“When using the Rule Based Optimizer -- the placement of tables in the FROM
clause is relevant”

jhc_hn说是rbo中from子句后的表是有次序相关的,和fly115说的不同,这令我困惑,请再帮忙解释一下!

使用道具 举报

回复
论坛徽章:
4
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34慢羊羊
日期:2015-03-04 14:19:442015年新春福章
日期:2015-03-06 11:57:31
12#
发表于 2003-7-28 10:18 | 只看该作者
To ancelotg: it's the same.

使用道具 举报

回复
论坛徽章:
4
ITPUB元老
日期:2005-04-26 14:47:45授权会员
日期:2005-10-30 17:05:33管理团队2006纪念徽章
日期:2006-04-16 22:44:45会员2006贡献徽章
日期:2006-04-17 13:46:34
13#
发表于 2003-7-28 11:00 | 只看该作者
那么,在from子句中,
如果是cbo,驱动表写在前面还是后面?
如果是rbo,驱动表写在前面还是后面?

但是又说rbo中是自动选择驱动表的,是么?

请再次解惑!

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
14#
发表于 2003-7-28 11:26 | 只看该作者

rule 下所谓驱动表

还有  nested loops  and  hash  join 之份

我们以 nested  loop 为例:

如果两个表连接字段都没有索引(通常这个时候是 sort  merge /  hash  join),则驱动表会选择后者

若两个表其中有一个有索引而另外一个没有索引,则驱动表是没有索引那一个,跟顺序无关

若两个表都有索引,则驱动表为 后面 那一个表

所以事实上,RULE下,只有在两个表都存在连接字段的索引的情况下才需要考虑顺序问题
也就是小表放在后面大表放在前面(当然到底哪个好这实际上还跟  符合条件的记录数、数据分布等因素相关!!!,所以应该以实际测试为准)

如果是 CBO 下则跟顺序无关

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
15#
发表于 2003-7-28 11:29 | 只看该作者

关键的

是明白执行计划

而不在于记什么规则

举例,表连接返回一条记录
存在两个表,一个 10条记录 ,一个1000万条记录

若2表都存在连接字段索引,若以小表为驱动表,则
代价:
10* (通过索引在大表查询一条记录的代价)

若以大表为驱动表:

1000万 * (通过索引在小表中查询一条记录的代价)

通过索引获取一条记录,10rows的表,代价通常在 3 blocks
索引2块,表一块

而如果是1000万的表,索引可能达到4块表一块
这样一来参考上面的计算,你说哪个更好?很显然!

小表查询参考

SQL>  create table test  as  select * from all_objects where rownum < 11;

Table created.

SQL> create index test_index on test(object_id);

Index created.

SQL> select object_id from test;

OBJECT_ID
----------
     18159
      7781
      4841
     19891
     22549
     17099
     17712
      4287
     10107
     19135

10 rows selected.


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   TABLE ACCESS (FULL) OF 'TEST'




Statistics
----------------------------------------------------------
          0  recursive calls
         12  db block gets
          6  consistent gets
          0  physical reads
          0  redo size
        736  bytes sent via SQL*Net to client
        425  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
         10  rows processed

SQL> select * from test where object_id = 4287;

OWNER                          OBJECT_NAME
------------------------------ ------------------------------
SUBOBJECT_NAME                  OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
------------------------------ ---------- -------------- ------------------
CREATED   LAST_DDL_ TIMESTAMP           STATUS  T G S
--------- --------- ------------------- ------- - - -
SYS                            /1033c8a_SqlTypeWithMethods
                                     4287                JAVA CLASS
14-NOV-00 03-JUL-03 2003-07-03:11:18:19 INVALID N N N



Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'TEST'
   2    1     INDEX (RANGE SCAN) OF 'TEST_INDEX' (NON-UNIQUE)




Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          3  consistent gets
          0  physical reads
          0  redo size
       1157  bytes sent via SQL*Net to client
        425  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL>

使用道具 举报

回复
论坛徽章:
4
ITPUB元老
日期:2005-04-26 14:47:45授权会员
日期:2005-10-30 17:05:33管理团队2006纪念徽章
日期:2006-04-16 22:44:45会员2006贡献徽章
日期:2006-04-17 13:46:34
16#
发表于 2003-7-28 11:42 | 只看该作者
多谢biti,现在明白多了。

biti来上海话,一定要请你吃大餐!

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
17#
 楼主| 发表于 2003-7-28 12:50 | 只看该作者
最初由 lancelotg 发布
[B]多谢biti,现在明白多了。

biti来上海话,一定要请你吃大餐!
[/B]

同感,多谢 biti_rainy !

使用道具 举报

回复
论坛徽章:
2
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
18#
发表于 2003-7-28 18:13 | 只看该作者

biti讲的切中要害,而且很好理解,高!

.

使用道具 举报

回复
论坛徽章:
3
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
19#
发表于 2004-3-4 13:10 | 只看该作者
对,要想明确的了解驱动表的概念,首先要把表连接的几种运行方式弄清楚。

使用道具 举报

回复
论坛徽章:
4
ITPUB元老
日期:2005-04-26 14:47:45授权会员
日期:2005-10-30 17:05:33管理团队2006纪念徽章
日期:2006-04-16 22:44:45会员2006贡献徽章
日期:2006-04-17 13:46:34
20#
发表于 2004-3-4 15:24 | 只看该作者
呵呵,这么老的帖子。

使用道具 举报

回复

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

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表