以一个比较两本字典来做例子:
       一本字典有索引目录(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. SQL Server中行列转换 Pivot UnPivot

    PIVOT用于将列值旋转为列名(即行转列),在SQLServer 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列)FOR 列 in (-) )AS P 完 ...

  2. Java集合(2):LinkedList

    一.LinkedList介绍 LinkedList也和ArrayList一样实现了List接口,但是它执行插入和删除操作时比ArrayList更加高效,因为它是基于链表的.基于链表也决定了它在随机访问 ...

  3. 5. Longest Palindromic Substring(最长回文子串 manacher 算法/ DP动态规划)

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

  4. Hive2.2.1概述(待重写)

    概述 hive 是一个包裹着 hdfs 的壳子,hive 通过 hql,将 sql 翻译成 MR ,进行数据查询. Hive是⼀个构建在Hadoop之上的数据仓库 hive的数据存在hdfs上,元信息 ...

  5. hadoop---Java 网络IO编程总结BIO、NIO、AIO

    转载请注明出处:http://blog.csdn.net/anxpp/article/details/51512200,谢谢! 本文会从传统的BIO到NIO再到AIO自浅至深介绍,并附上完整的代码讲解 ...

  6. Python3.x:实现多任务(多进程)

    Python3.x:实现多任务(多进程) # python3 # author lizm # datetime 2018-02-13 16:00:00 # -*- coding: utf-8 -*- ...

  7. kali安装后配置

    0x00.安装Vmware Tools 由于是在VMware Workstation里面安装的,所以需要首先安装VMware tools工具方便我们Ctrl+C和Ctrl+V,步骤如下: 在VMWar ...

  8. MLP(多层神经网络)介绍

    写在前面的 接触神经网络(ANN)的时间很长了,以前也只是学了学原理,做过一个BPN的练习,没有系统的总结过,最近看Torch的源码,对MLP有了更多的了解,写写自己学到的东西吧,算是做了一次总结! ...

  9. Ubuntu系统Anaconda下载安装与切换源教程【转】

    本文转载自:https://blog.csdn.net/qq_36268036/article/details/81517893 1. 下载安装: 这里选用国内清华大学的Tuna开源软件镜像站作为演示 ...

  10. ResulsetHandler九个实现类

    ResulsetHandler九个实现类 ArrayHandler, 将结果集中第一条记录封装到Object[],数组中的每一个元素就是记录中的字段值. ArrayListHandler, 将结果集中 ...