Oracle优化之表连接方式

简介: Oracle优化之表连接方式在Oracle数据库中,两个表之间的表连接方法有排序合并连接、嵌套循环连接、哈希连接和笛卡尔连接四种1.排序合并连接(sort merge join)  排序合并连接是一种两表在做表连接时用排序(SORT)操作和合并(MERGE)操作来得到连接结果集的表连接方法 ...

Oracle优化之表连接方式
在Oracle数据库中,两个表之间的表连接方法有排序合并连接、嵌套循环连接、哈希连接和笛卡尔连接四种

1.排序合并连接(sort merge join)

  排序合并连接是一种两表在做表连接时用排序(SORT)操作和合并(MERGE)操作来得到连接结果集的表连接方法

  如果t1表和t2表在做表连接时使用的是排序合并连接,那么Oracle会依次执行如下步骤:

    a.以目标SQL中指定的谓词条件访问t1表,然后对访问结果按照t1表的连接列排序,排好序后的结果集记为s1

    b.以目标SQL中指定的谓词条件访问t2表,然后对访问结果按照t2表的连接列排序,排好序后的结果集记为s2

    c.对s1和s2进行合并操作,从中取出匹配记录作为最终的结果集

  排序合并连接的优缺点及适用场景:

    a.通常情况下hash join的效果都比sort merge join要好,但是,如果行源已经被排过序,在执行sort merge join时不需要再排序,这时sort merge join的性能会优于hash join

    b.通常情况下,只有在以下情况发生时,才会使用排序合并连接:

      1)RBO模式

      2)不等值连接(>,<,>=,<=)

      3)哈希连接被禁用时(_HASH_JOIN_ENABLED=false)

      4)数据源已排序

  --示例 

View Code
2.嵌套循环连接(nested loops join)

  嵌套循环连接是一种两表在做表连接时依靠两层嵌套循环(外层循环/内层循环)来得到连接结果集的表连接方法

  如果t1表和t2表在做表连接时使用的是嵌套循环连接,那么Oracle会依次执行如下步骤:

    a.首先,优化器会按照一定的规则来决定t1和t2谁是驱动表谁是被驱动表,驱动表用于外层循环,被驱动表用于内存循环。假设t1是驱动表

    b.以目标SQL中指定的谓词条件访问驱动表t1,得到结果集s1

    c.遍历s1,同时遍历被驱动表t2,即取出s1中的记录按照连接条件和被驱动表t2做匹配。最终将得到的结果集返回

  嵌套循环连接的优缺点及适用场景:

    a.能够实现快速响应,即可以第一时间先返回已经连接过且满足连接条件的记录,而不必等待所有的连接操作全部做完后才返回连接结果

    b.适用于驱动表所对应的驱动结果集的记录数较少,同时在被驱动表的连接列上又存在唯一性索引(或者在被驱动表的连接列上存在选择性很好的非唯一性索引)的情况

  --示例

View Code
3.哈希连接(hash join)

  哈希连接是一种两表在做表连接时依靠哈希运算来得到连接结果集的表连接方法,oracle 7.3之后引入

  Hash join的工作方式是将一个表(通常是小一点的那个表)做hash运算并存储到hash列表中,从另一个表中抽取记录,做hash运算,到hash 列表中找到相应的值,做匹配

  哈希连接只适用于CBO,也只能用于等值连接条件

  哈希连接很适合于小表和大表做连接,特别是在小表的连接列的可选择性非常好的情况下,这时候哈希连接的执行时间就可以近似看作是和全表扫描那个大表所耗费的时间相当

  哈希连接时,驱动结果集对应的Hash Table能够完全被容纳在内存中(PGA的工作区),此时的哈希连接的执行效率非常高

  哈希连接的性能问题可以通过10104事件来诊断,相关说明如下:   

    Number of in-memory partitions (may have changed): Hash Partition
    Final number of hash buckets: Hash Bucket数量
    Total buckets: Empty buckets: Non-empty buckets: Hash Bucket中空记录及非空记录的情况
    Total number of rows: 驱动结果集的记录数
    Maximum number of rows in a bucket: 包含记录数最多的Hash Bucket所含记录的数量
    Disabled bitmap filtering: 是否启用位图过滤

  --示例

相关文章
|
3月前
|
存储 Oracle 关系型数据库
Oracle存储过程插入临时表优化与慢查询解决方法
优化是一个循序渐进的过程,就像雕刻一座雕像,需要不断地打磨和细化。所以,耐心一点,一步步试验这些方法,最终你将看到那个让你的临时表插入操作如同行云流水、快如闪电的美丽时刻。
193 14
|
5月前
|
Oracle 安全 关系型数据库
【Oracle】使用Navicat Premium连接Oracle数据库两种方法
以上就是两种使用Navicat Premium连接Oracle数据库的方法介绍,希望对你有所帮助!
1160 28
|
8月前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
Oracle 关系型数据库 数据库
已解决:idea 连接 oracle 数据库 避雷
已解决:idea 连接 oracle 数据库 避雷
137 2
|
10月前
|
SQL Oracle 关系型数据库
Oracle数据库优化方法
【10月更文挑战第25天】Oracle数据库优化方法
193 7
|
10月前
|
存储 Oracle 关系型数据库
Oracle数据库优化策略
【10月更文挑战第25天】Oracle数据库优化策略
140 5
|
11月前
|
SQL Oracle 关系型数据库
Python连接Oracle
Python连接Oracle
133 0
|
监控 Oracle 关系型数据库
"深度剖析:Oracle SGA大小调整策略——从组件解析到动态优化,打造高效数据库性能"
【8月更文挑战第9天】在Oracle数据库性能优化中,系统全局区(SGA)的大小调整至关重要。SGA作为一组共享内存区域,直接影响数据库处理能力和响应速度。本文通过问答形式介绍SGA调整策略:包括SGA的组成(如数据缓冲区、共享池等),如何根据负载与物理内存确定初始大小,手动调整SGA的方法(如使用`ALTER SYSTEM`命令),以及利用自动内存管理(AMM)特性实现智能调整。调整过程中需注意监控与测试,确保稳定性和性能。
890 2
|
SQL Oracle 关系型数据库
Oracle游标的使用和优化技巧
Oracle游标的使用和优化技巧
|
SQL Oracle 关系型数据库
Oracle游标的使用和优化技巧
Oracle游标的使用和优化技巧