以一个比较两本字典来做例子:
       一本字典有索引目录(dict a), 一本没有(dict b)
       现在要找出所有a开头的单词的异同
       那么比较的时候,你会怎么比较?
       合理的做法应该是以没有索引的字典dict b开始, 找到a开头的那一页, 然后对于每个单词, 通过使用索引在dict a中找到相应的条目
       如果反过来, 效率会相同吗?
       驱动表,通俗的讲就是先从哪个表开始检索,良好的驱动表是成功优化的一半
       例如:
       select * from a,b where a.id = b.id and a.姓名 = '美格瑞恩' and b.性别 = '女';
       在a,b表同等数量级的情况下,显然用a表做为驱动表比较好
       因为姓名相对于性别来说可以过滤掉更多的数据
       所以想办法使你的执行计划先扫描a表再通过nest loop与b表关连比较理想

一般而言,2个表的时候,选择小表;3个或者以上的时候,选择关联比较多的表作为驱动表
       不过,事无绝对,看个案例先:
       有两个表T1和T2,可以假设T1存放姓名、ID这些基本信息,每行较短
       而T2也有ID列和一些说明、备注类信息,每行长的可能有一两千个字节
       对于这两个表,使用嵌套循环连接,T1表占的块数比较少,是小表
       而T2表占的块数几倍于T1,是大表。那么,应该T1做驱动表更好一些,但实际却是T2大表做驱动表更好
       一个不知道DBA还是开发,不知道这一点,为了强制小表T1做驱动表,写了类如下语句:
       select /*+ ordered use_nl(t1,t2) */ from t2,t1 where t1.id=t2.id;
       后来这个语句造成了一些性能问题。通过了解嵌套循环的工作方式,发现这里的确是大表做驱动表好一些
       这里就说明了一个问题,都说嵌套循环要小表做驱动表,如果不知道这是为什么,这很容易造成人云亦云
       这样只知其表,而不知其里,很容易影响以后在某些问题上做出的判断

驱动表(driving table/outer table)又称为外层表,驱动表仅仅用于nested_loop join 和 hash join

       驱动表是用来驱动查询的
       在CBO中,优化器会根据cost自动选择驱动表,与表的顺序无关
       通常情况下,驱动表的选择性较高(该列唯一键与列的比值较高),where中的限制条件较多,返回的行数较少的表适合做驱动表
       事实上,大表有时候也会做驱动表,只要在大表上面限制条件较多,从大表上面返回的行数较少的话,大表也适合做驱动表
       始终要记住的就是返回的结果集(某个表被过滤后的数据,或者某些表join 产生的数据)较小的表适合做驱动表
       也就是说,哪个返回数据少 ,哪个就做驱动表,即连接操作应从返回较少行上驱动
       我们在看执行计划的时候,离nested loops,hash join 近的表就是驱动表,也就是说执行计划中靠上的表是驱动表
       以下是几个快速判断驱动表的经验,可能有错哦:
     
         (1)用于连接的子句的列应被索引、在Where子句中应尽量利用索引,而不是避开索引  
         (2)连接操作应从返回较少行上驱动
         (3)如果所连接的表A和B,A表长度远远大于B表,建议从较大的A表上驱动  
         (4)如果Where子句中含有选择性条件,Where No=20,将最具有选择性部分放在表达式最后  
         (5)如果只有一个表有索引,另一表无索引,无索引的表通常作为驱动表。如A表的No列以被索引
                  而B表的No列没被索引,则应当B表作为驱动表,A表作为被驱动表  
     
              
       RULE 下所谓驱动表
       我们以 nested  loop 为例:
       如果两个表连接字段都没有索引(通常这个时候是 sort  merge /  hash  join),则驱动表会选择后者
       若两个表其中有一个有索引而另外一个没有索引,则驱动表是没有索引那一个,跟顺序无关
       若两个表都有索引,则驱动表为 后面 那一个表
       所以事实上,RULE下,只有在两个表都存在连接字段的索引的情况下才需要考虑顺序问题
       也就是小表放在后面大表放在前面(当然到底哪个好这实际上还跟符合条件的记录数、数据分布等因素相关!,所以应该以实际测试为准)
       而如果是 CBO 下,则跟顺序无关

转:oracle驱动表的更多相关文章

  1. SWAP_JOIN_INPUTS Oracle Hint(处理hash join强制大表(segment_size大)作为被驱动表)

    SWAP_JOIN_INPUTS Oracle Hint(处理hash join强制大表(segment_size大)作为被驱动表) swap_join_inputs是针对哈希连接的hint,它的含义 ...

  2. 如何利用Oracle外部表导入文本文件的数据

    同事最近在忙数据一致性比对工作,需要对不同文本文件中的数据进行比对,有的文件较大,记录较多,如果用普通的文本编辑器打开的话,很显然,会很卡,甚至打不开. 基于此,可将该文本文件的数据导入到数据库中,在 ...

  3. 日常工作: 应用服务器Oracle驱动问题说明

    1. .net使用Oracle驱动的发展等 作为.net线的产品的ERP产品 最初的版本 使用了.net 1.1发布时 微软提供的Oracle的驱动 但是后续微软的.net产品线貌似没有继续发展相应的 ...

  4. 在代码生成工具Database2Sharp中使用ODP.NET(Oracle.ManagedDataAccess.dll)访问Oracle数据库,实现免安装Oracle客户端,兼容32位64位Oracle驱动

    由于我们开发的辅助工具Database2Sharp需要支持多种数据库,虽然我们一般使用SQLServer来开发应用较多,但是Oracle等其他数据库也是常用的数据库之一,因此也是支持使用Oracle等 ...

  5. oracle多表连接方式Hash Join Nested Loop Join Merge Join

    在查看sql执行计划时,我们会发现表的连接方式有多种,本文对表的连接方式进行介绍以便更好看懂执行计划和理解sql执行原理. 一.连接方式:        嵌套循环(Nested  Loops (NL) ...

  6. Oracle的表锁死以及解锁

    Oracle的表锁死以及解锁 oracle 查看锁死的表,锁死的进程. select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_na ...

  7. ORACLE外部表总结

    外部表介绍 ORACLE外部表用来存取数据库以外的文本文件(Text File)或ORACLE专属格式文件.因此,建立外部表时不会产生段.区.数据块等存储结构,只有与表相关的定义放在数据字典中.外部表 ...

  8. Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence

    Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence 使用oracle11g插入数据时遇到这样一个问题: 1 --创建测试表-- 2 CREATE T ...

  9. oracle 锁表问题

    oracle执行表数据更新的时候,会遇到锁表问题,比方说,会遇到这样的问题,主要原因是这张表被其他人占用,修改数据没有提交.oracle为了避免脏数据的产生,在其安全机制下,锁住该表. 执行如下操作, ...

随机推荐

  1. mysql乐观锁总结和实践(转)

    原文:mysql乐观锁总结和实践 上一篇文章<MySQL悲观锁总结和实践>谈到了MySQL悲观锁,但是悲观锁并不是适用于任何场景,它也有它存在的一些不足,因为悲观锁大多数情况下依靠数据库的 ...

  2. 正则表达式 \b

    引用网上一段话: \b 是正则表达式规定的一个特殊代码(好吧,某些人叫它元字符,metacharacter),代表着单词的开头或结尾,也就是单词的分界处.虽然通常英文的单词是由空格,标点符号或者换行来 ...

  3. 这些Python骚操作,你知道吗?

    0x00 世界,你好 ​程序员第一次接触语言或者框架,基本上都有个 Hello World 的例子,这里 Python 直接将它做成了一个包. 0x01 Python 哲学 ​ Python 执行 i ...

  4. 我的Java开发学习之旅------>Java利用Comparator接口对多个排序条件进行处理

    一需求 二实现Comparator接口 三验证排序结果 验证第一条件首先按级别排序级别最高的排在前面 验证第二条如果级别相等那么按工资排序工资高的排在前面 验证第三条如果工资相当则按入职年数排序入职时 ...

  5. SSDT表概念具体解释

    SSDT 的全称是 System Services Descriptor Table,系统服务描写叙述符表. 这个表就是一个把 Ring3 的 Win32 API 和 Ring0 的内核 API 联系 ...

  6. static关键字注意事项

    /* static关键字注意事项 A:在静态方法中是没有this关键字的 如何理解呢? 静态是随着类的加载而加载,this是随着对象的创建而存在. 静态比对象先存在. B:静态方法只能访问静态的成员变 ...

  7. Linux学习笔记—Linux磁盘与文件系统管理(转载)

    认识EXT2文件系统 文件的系统特性 Linux的正规文件系统为Ext2 文件数据除了文件实际内容外,还包括其他属性(文件权限.文件属性). 文件系统将这两部分数据分别存放在不同的块,权限和属性放在i ...

  8. java要注意的问题1

    一.优先返回空集合而非null 如果程序要返回一个不包含任何值的集合,确保返回的是空集合而不是null.这能节省大量的”if else”检查. public class getLocationName ...

  9. window下rails4.1 发生TZInfo::DataSourceNotFound 错误

    在官网上学习rails 4.1 ,启动rails server之后发生了如下错误 $ rails serverBooting WEBrickRails 4.1.0 application starti ...

  10. hadoop12---java并发编程的一些总结

    java并发编程的一些总结 %.1.不应用线程池的缺点 有些开发者图省事,遇到需要多线程处理的地方,直接new Thread(...).start(),对于一般场景是没问题的,但如果是在并发请求很高 ...