`

深入理解Oracle—驱动表的那些事儿

阅读更多

        以一个比较两本字典来做例子:

       一本字典有索引目录(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 下,则跟顺序无关。 

        关键的是明白执行计划,而不在于记住什么规则。

        例如,表连接返回一条记录,存在2张表,一个10条记录,一个1000万条记录,若2表都存在连接字段索引。

        以小表为驱动表,则代价为:10*(通过索引在大表查询一条记录的代价);

        以大表为驱动表,则代价为:1000万*(通过索引在小表查询一条记录的代价)。

        通过索引获取一条记录,10rows的表,代价通常在3 blocks,索引2块,表1块。而如果是1000万的表,索引可能达到4块,表1块,速度掰着脚趾头都知道了哈。

 

文章来源:http://www.2cto.com/database/201301/186606.html

分享到:
评论

相关推荐

    深入理解OracleRAC12c

    资源名称:深入理解Oracle RAC 12c内容简介:《深入理解Oracle RAC 12c》介绍了Oracle RAC 12c技术的方方面面,涵盖了与RAC技术相关的集群件知识、数据库知识、存储知识、网络知识,并在基于RAC的应用软件设计、优化...

    深入理解Oracle Exadata

    深入理解Oracle Exadata

    深入理解Oracle RAC 12c(完整书签).pdf

    深入理解Oracle RAC 12c,需要掌握以下几个核心知识点: 1. 集群架构:了解Oracle RAC集群的架构是基础。Oracle RAC使用集群件(Clusterware)来协调集群节点间的关系,使用全局资源管理来控制数据访问和维护数据...

    深入理解Oracle RAC 12c(完整书签)分卷1

    深入理解Oracle RAC 12c(完整书签)深入理解Oracle RAC 12c(完整书签)深入理解Oracle RAC 12c(完整书签)

    深入理解Oracle RAC 12c(完整书签) 中文版

    深入理解Oracle RAC 12c意味着探究这个分布式数据库系统的内部机制,以及如何在企业环境中有效地利用它。以下是Oracle RAC 12c的一些核心知识点: 1. **Oracle RAC的基本概念**:Oracle RAC允许多个实例同时访问同...

    Oracle编程艺术++深入理解数据库体系结构+第三版

    深入理解Oracle数据库体系结构,大师之作,推荐阅读。

    各版本Oracle驱动包下载

    首先,Oracle驱动包主要用于Java应用程序与Oracle数据库之间的通信,主要的驱动类型是JDBC(Java Database Connectivity)驱动。JDBC驱动分为四种类型:Type 1、Type 2、Type 3和Type 4。其中,Type 4驱动是纯Java...

    DBeaver Oracle驱动

    通过DBeaver与Oracle驱动的结合,开发者和数据库管理员可以享受到强大的数据库操作功能,如SQL编写、数据浏览、表和索引管理、存储过程执行以及性能分析等。同时,由于DBeaver的跨平台性,用户可以在Windows、Linux...

    KETTLE oracle驱动

    【Kettle与Oracle驱动】 Kettle,又称为Pentaho Data Integration(PDI),是一款强大的数据集成工具,它允许用户进行数据抽取、转换和加载(ETL)操作。Oracle驱动在Kettle中扮演着至关重要的角色,因为它使得...

    oracle深入 chm oracle深入

    Oracle数据库是全球广泛使用的大型企业级关系型数据库管理系统,它提供了高效、稳定的数据存储和管理解决方案。...读者可以通过这个文件深入理解Oracle数据库的各个方面,提升数据库管理和开发技能。

    深入理解Oracle12c

    资源名称:深入理解Oracle 12c资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    深入理解Oracle_RAC_12c PDF电子书下载 带书签目录 完整版.zip(2-2)

    花钱买的,深入理解Oracle_RAC_12c PDF电子书下载 带书签目录 完整版.zip,之前那个只有5章,共两个包,链接:https://download.csdn.net/download/notbaron/9457128

    深入解析Oracle 盖国强 高清版

    《深入解析Oracle》是由盖国强先生撰写的一本专业书籍,专注于Oracle数据库系统的深度剖析。这本书分为10个章节,每个章节对应一个独立的PDF文档,这样的分章设计旨在提高读者的阅读体验,使得学习和查阅更为方便。...

    dbeaver oracle离线驱动包

    离线驱动包意味着用户无需互联网连接即可在DBeaver中安装和使用这些驱动,这对于那些网络环境不稳定或者有安全规定的环境非常有用。 描述中的“本人亲测可用,只为挣点积分”表明这个离线驱动包已经过发布者的实际...

    oracle驱动.rar

    Oracle驱动是用于连接...总之,Oracle驱动是Java开发者与Oracle数据库沟通的桥梁,理解其分类和使用方法对于进行数据库操作至关重要。正确选择和配置驱动能够提升应用程序的性能,并确保数据库操作的稳定性和安全性。

    java eclipse myeclipse oracle 驱动 oracle driver

    Java、Eclipse、MyEclipse 和 Oracle 驱动,这些关键词构成了我们今天要讨论的核心技术领域:Java 开发工具与 Oracle 数据库的连接。Oracle 驱动,也称为 JDBC(Java Database Connectivity)驱动,是Java应用程序与...

    tomcat5.5 oracle驱动包

    本文将深入探讨如何在Tomcat 5.5中集成Oracle驱动,以及在Windows 64位环境下进行相关操作。 首先,Oracle驱动包是Java数据库连接(JDBC)驱动,它允许Java应用程序通过网络与Oracle数据库进行交互。对于Tomcat 5.5...

    oracle驱动jar包10.2.0

    Oracle驱动jar包10.2.0是Oracle公司为Java应用程序提供的一种数据库连接驱动,它使得Java程序能够与Oracle数据库进行交互。Oracle JDBC驱动(Java Database Connectivity)是Oracle官方提供的用于在Java应用程序中...

    qt4.7版本的oracle驱动

    Qt 4.7 版本的 Oracle 驱动是一个专为Qt应用程序设计的数据库连接组件,用于在Windows平台上与Oracle数据库系统(版本10.2.0)进行交互。这个驱动程序是针对Qt 4.7框架进行编译的,以确保与该版本的Qt库兼容性。在...

Global site tag (gtag.js) - Google Analytics