ITPub博客

首页 > 数据库 > Oracle > 表连接的方法

表连接的方法

原创 Oracle 作者:suinlove 时间:2015-03-25 08:51:51 0 删除 编辑
访问表的方法
1、全表扫描(Full Table Scans, FTS):
缺点:
扫描高水位线(HWM,降低HWM的方法有哪些?)以下的数据块,即使delete掉所有的数据,扫描的块数不变;
执行时间不稳定、不可控:会随着数据量的增长而递增。
优化:
多块并行读(db_block_multiblock_read_count参数设定),减少了I/O次数,提高了系统的吞吐量
具体了解:http://www.cnblogs.com/Richardzhu/archive/2013/01/23/2872587.html 


2、ROWID扫描,即Oracle在访问目标表的数据时,直接通过数据所在的ROWID定位并访问这些数据。ROWID表示的是Oracle中数据行记录所在的物理存储地址,ROWID与数据块行记录一一对应关系。
TABLE ACCESS BY USER ROWID:根据用户在SQL语句中输入的ROWID值直接访问对应的数据行记录
TABLE ACCESS BY INDEX ROWID:先访问索引,根据访问索引得到的ROWID再回表访问对应数据行记录
具体了解:http://blog.csdn.net/leshami/article/details/6931886 


访问索引的方法
索引唯一性扫描(INDEX UNIQUE SCAN),针对唯一性索引(UNIQUE INDEX)的扫描,仅适用于where条件后是等值查询的目标SQL,最多只返回一条记录。
索引范围扫描(INDEX RANGE SCAN),可能会返回多条记录。
唯一性索引,目标SQL的WHERE条件一定是范围查询(谓词条件为BETWEEN、<、>等);
非唯一性索引,目标SQL的WHERE条件没有限制(可以是等值查询,也可以是范围查询)
索引全扫描(INDEX FULL SCAN),适用于所有类型的B树索引(包括唯一性索引和非唯一性索引)。
特征:
扫描目标索引所有叶子块的所有索引行,但不一定扫描目标索引的所有分支块,因为索引叶子块之间是双向指针链表,从左至右依次顺序扫描该索引所有叶子块的所有索引行即可。
返回的数据是有序的,按照索引的索引键值列来排序,无需再进行排序。
索引快速全扫描(INDEX FAST FULL SCAN),类似于索引全扫描,也适用于所有的B树索引。
与索引全扫描的三点区别:
索引快速全扫描只适用于CBO;
索引快速全扫描可以使用多块读,也可以并行执行;
索引快速全扫描的执行结果不一定是有序的,是根据索引行所在的磁盘上的物理存储顺序来扫描,而不是根据索引行的逻辑顺序扫描的
索引跳跃式扫描(INDEX SKIP SCAN)适用于所有类型的复合B树索引(包括唯一性索引和非唯一性索引),它使那些在where条件中没有对目标索引的前导列指定查询条件但同时对该索引的非前导列指定了查询条件的目标SQL依然能用上该索引,实际上是ORACLE对索引的前导列的所有distinct值做了遍历,相当于对原目标SQl的等价改写。


表连接
表连接的类型
内连接
外连接
表连接的方法
排序合并连接(Sort Merge Join)是一种两个表在做表连接时用排序操作(Sort)和合并操作(Merge)来得到连接结果集的表连接方法。
排序合并连接的优缺点及适用场景:
通常情况下,排序合并连接的执行效率远不如哈希连接,但前者使用范围更广,因为哈希连接通常只能用于等值连接,而排序合并连接还能用于其他连接条件(<、<=、>、>=)。
通常情况下,排序合并连接不适用与OLTP系统,排序是非常昂贵的操作,如果能避免,则可以使用排序合并连接的。
排序合并连接不存在驱动表的概念
嵌套循环连接(Nested Loops Join)是一种两个表在做表连接时依靠两层嵌套循环(分别是外层循环和内层循环)来得到结果集的表连接方法。
嵌套循环的优缺点及适用场景
如果驱动表的驱动结果集记录数较少,同时被驱动表的连接列上存在唯一性索引(或选择性很好的非唯一性索引),那么嵌套循环连接的执行效率会非常高;否则执行效率会很低。
只要驱动结果集的记录数较少,就具备了做嵌套循环连接的前提条件,驱动结果集是在对驱动表应用了目标SQL中指定的谓词条件后所得到的结果集,即使是大表作为驱动表,只要目标SQL的谓词条件能把驱动结果集的数据量降下来即可。
嵌套循环连接的被驱动表存在索引情况下一般是单块读,驱动结果集有多少条记录,需要访问索引多少次,可能会进行回表操作(优化:11g中引入了向量I/O,Oracle可以将原来一批单块读所需要耗费的物理I/O组合起来,然后用一个向量I/O去批量处理他们,实现了在单块读数量不降低的情况下减少单块读所耗费的I/O数量,提高嵌套循环连接的执行效率)。
哈希连接(Hash Join)是一种两个表在做表连接时主要依靠哈希运算来得到连接结果集的表连接方法。
哈希连接的优缺点及适用场景
哈希连接不一定排序,或者说大多数情况下不需要排序
哈希连接的驱动表所对应的连接列的可选择性尽可能好,因为这个可选择性会影响对应Hash Bucket中的记录数,而Hash Bucket中的记录数会直接影响从该Hash Bucket中查找匹配记录的效率。
哈希连接只能用于CBO,且只能用于等值连接条件。
哈希连接适用于小表和大表之间且连接结果集的记录数较多的情形,特别是小表的可选择性特别好的情况下,这时候哈希连接的执行时间可以近似看做是和全表扫描大表所耗费的时间相当。
当两个表做哈希连接时,如果在施加了目标SQL指定的谓词条件后得到的数据量较小的结果集所对应的hash table能够完全容纳在内存中(PGA的工作区),则此时的哈希连接效率会非常高


笛卡尔连接(笛卡尔乘积Cartesian Product),是一种在两个表在做表连接时没有任何连接条件的表连接方法。
笛卡尔连接的优缺点及适用场景
目标SQL漏写表连接条件
有时候出现笛卡尔连接是因为在目标SQL中使用了ORDERED Hint,同时在该SQL的SQL文本中位置相邻的两个表之间没有之间的关联条件
有时候出现笛卡尔连接是因为目标SQL表中的相关表的统计信息不准。




上述内容全出自<基于Oracle的SQL优化_崔华>一书

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28502884/viewspace-1472618/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 整理
请登录后发表评论 登录
全部评论

注册时间:2014-10-29

  • 博文量
    29
  • 访问量
    26942