`
can_do
  • 浏览: 266011 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于Oralce中的连接(外连接和内连接)

阅读更多
Note:2009-1-15
Oracle必须为每对行源执行连接操作,连接的方法包括嵌套循环、排序合并、散列连接、笛卡尔积等。
1.嵌套循环连接的成本计算公式:
cost = access cost of A + (access cost of B * number of rows from A)
2.散列连接的成本计算公式:
cost = (access cost of A * number of hash partitions of B) + access cost of B
3.排序合并连接的成本计算公式:
cost = access cost of A + access cost of B + (sort cost of A + sort cost of B)
********************
Note:2009-1-15
1.use_nl:use nesting loop
2.use_hash:use hash
3.use_merge use merge
*****************
Note:2009-1-15
SQL> show parameter workarea_size_policy

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
workarea_size_policy                 string      AUTO

SQL> show parameter pga_aggregate_target

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target                 big integer 629145600
*****************************
Note:2009-1-15
不论是嵌套循环外连接还是散列外连接,CBO不会根据成本去选择连接顺序,被驱动的表总是含有(+)的一方:
SQL> select /*+ordered use_nl(t1 t2)*/ t1.msisdn,t2.msisdn from t1,t2 where t1.msisdn(+)=t2.msisdn;
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=100 Card=99 Bytes=2178)
   1    0   NESTED LOOPS (OUTER) (Cost=100 Card=99 Bytes=2178)
   2    1     INDEX (FULL SCAN) OF 'IND_T2' (NON-UNIQUE) (Cost=1 Card=99 Bytes=1089)
   3    1     INDEX (RANGE SCAN) OF 'IND_T1' (NON-UNIQUE) (Cost=1 Card=1 Bytes=11)

虽然使用了ORDERED提示,试图以t1作为驱动表,可是由于是外连接,仍然是以t2作为驱动表。换成散列连接也是一样

SQL> select /*+ordered use_hash(t1 t2)*/ t1.msisdn,t2.msisdn from t1,t2 where t1.msisdn(+)=t2.msisdn;
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=99 Bytes=2178)
   1    0   HASH JOIN (OUTER) (Cost=4 Card=99 Bytes=2178)
   2    1     INDEX (FULL SCAN) OF 'IND_T2' (NON-UNIQUE) (Cost=1 Card=99 Bytes=1089)
   3    1     INDEX (FAST FULL SCAN) OF 'IND_T1' (NON-UNIQUE) (Cost=2 Card=999 Bytes=10989)

******************************
Note:2009-1-15
select t1.msisdn,t2.msisdn
from t1
full outer join t2
on t1.msisdn=t2.msisdn
order by t2.msisdn

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=15 Card=1000 Bytes=36000)
   1    0   SORT (ORDER BY) (Cost=15 Card=1000 Bytes=36000)
   2    1     VIEW (Cost=6 Card=1000 Bytes=36000)
   3    2       UNION-ALL
   4    3         NESTED LOOPS (OUTER) (Cost=2 Card=999 Bytes=21978)
   5    4           INDEX (FAST FULL SCAN) OF 'IND_T1' (NON-UNIQUE) (Cost=2 Card=999 Bytes=10989)
   6    4           INDEX (RANGE SCAN) OF 'IND_T2' (NON-UNIQUE)
   7    3         HASH JOIN (ANTI) (Cost=4 Card=1 Bytes=22)
   8    7           INDEX (FULL SCAN) OF 'IND_T2' (NON-UNIQUE) (Cost=1 Card=99 Bytes=1089)
   9    7           INDEX (FAST FULL SCAN) OF 'IND_T1' (NON-UNIQUE) (Cost=2 Card=999 Bytes=10989)
**********************************************************

说明:full outer join = left outer join + right outer join +union all

oracle中hint的用法: select /*+keyword_parameter*/ selected_column_set from table_name where query_condition

Note:2009-1-15
排序合并连接(Sort Merge Join, SMJ):
对于非等值连接,这种连接方式的效率是比较高的,因此主要用于不等价连接,如<、 <=、 >、 >=,但是不包括 <>,如果在关联的列上都有索引,效果更好。对于将两个较大的row source做连接,或者连接列缺乏可使用或可选择性的索引,该连接方法比NL连接要好一些。但是如果sort merge返回的row source过大,则又会导致使用过多的rowid在表中查询数据时,数据库性能下降,因为过多的I/O。所有的表都需要排序。它为最优化的吞吐量而设计,并且在结果没有全部找到前不返回数据。
嵌套循环(Nested Loops, NL):
如果driving row source(外部表)比较小,并且在inner row source(内部表)上 有唯一索引,或有高选择性非唯一索引时,使用这种方法可以得到较好的效率。
NESTED LOOPS有其它连接方法没有的的一个优点是:可以先返回已经 连接的行,而不必等待所有的连接操作理完才返回数据, 这可以实现快速的响应时间。
哈希连接(Hash Join, HJ):
一般来说,其效率应该好于其它2种连接,但是这种连接只能用在 CBO优化器中,而且需要设置合适的hash_area_size参数, 才能取得较好的性能。
在两个较大的row source之间连接时会取得相对较好的效率,在一个 row source较小时则能取得更好的效率。只能用于等值连接中

编写于【2009-01-15】
分享到:
评论

相关推荐

    理解oracle中的外连接

    在Oracle数据库系统中,外连接(Outer Join)是一种高级的SQL联接操作,它扩展了标准的内连接(Inner Join)概念,允许我们查询不匹配的数据。外连接分为三种类型:左外连接(Left Outer Join)、右外连接(Right ...

    oracle 左连接 右连接学习

    Oracle 左连接右连接学习 ...左连接、右连接、内连接、全连接和交叉连接都是 Oracle 中的连接类型,每种类型都有其特点和应用场景。了解每种连接类型的用途和特点,可以帮助我们更好地使用 Oracle 实现业务需求。

    oracle客户端连接远程服务器

    标题中提到的“Oracle客户端连接远程服务器”,是指使用Oracle数据库客户端软件来建立与远程Oracle数据库服务器的连接。Oracle数据库是一种广泛使用的商业数据库系统,它支持多用户并发访问并保证数据的一致性,适用...

    强制释放Oracle数据连接方案

    以上就是关于如何查看、调整Oracle数据库连接数量限制的方法。在实际操作中,还需要根据具体的环境和需求来决定最适合的解决方案。希望这些信息能帮助你在遇到数据库连接超限时,能够快速有效地解决问题。

    Oracle左(外)、右(外)、全(外)、(内)连接语法与SQL标准的比较

    本文将深入探讨Oracle中的左(外)、右(外)、全(外)以及内连接的语法,并将其与SQL标准进行比较,以帮助读者更好地理解和应用这些关键概念。 ### 左(外)连接(Left Outer Join) #### SQL标准语法 左(外)连接返回左...

    oracle远程连接服务器出现 ORA-12170 TNS:连接超时 解决办法

    您可能感兴趣的文章:常用的Oracle doc命令(收藏)Oracle 多行记录合并/连接/聚合字符串的几种方法Oracle中字符串连接的实现方法php连接oracle数据库及查询数据的方法plsql连接oracle数据库报ora 12154错

    geoserver2.14.0 oracle 数据库连接

    本文将深入探讨如何使用GeoServer 2.14版本与Oracle数据库进行集成,以及如何在GeoServer中读取并显示Oracle数据库内的Shapefile数据。 首先,Oracle数据库是全球领先的大型企业级数据库管理系统,广泛应用于数据...

    易语言oracle数据库连接模块源码

    1. 数据库连接:讲解如何在易语言中加载oraociei10.dll,并使用相关函数初始化和建立与Oracle服务器的连接。 2. SQL操作:介绍如何使用易语言构造SQL语句,执行查询、插入、更新和删除等操作。 3. 参数绑定:解释...

    oracle 最大连接数问题

    2. **Oracle 参数配置不当**:虽然配置文件中的 `processes` 和 `sessions` 参数分别设置为了800和885,但实际连接数仍受限于250个,这表明可能存在其他参数配置不当导致的问题。 3. **Listener 配置问题**:尝试在 ...

    oracle数据库连接工具

    oracle数据库连接工具:toad oracle 11

    sap 与 oracle数据库的连接

    SAP系统与Oracle数据库的连接是SAP开发中的一个重要步骤,该连接允许SAP系统访问Oracle数据库中的数据,实现数据交换和共享。在本文中,我们将详细介绍SAP开发中模块连接Oracle数据库的具体方法步骤。 首先,需要...

    连接mysql和oracle的连接池包

    本压缩包提供了连接MySQL和Oracle数据库的连接池组件,使得开发人员能够在同一应用中便捷地处理这两种不同的数据库系统。 1. **连接池的概念**: 连接池是一种数据库管理策略,它预先创建并维护一定数量的数据库...

    Oracle Spatial与ArcGIS连接

    本文旨在探讨ArcGIS与Oracle Spatial之间的直接连接方法,并讨论在此过程中遇到的问题及其解决方案。 #### 二、ArcGIS与Oracle Spatial直接连接概述 **2.1 直接连接的意义** 直接连接(Direct Connect)是指ArcGIS...

    C#中连接oracle连接方法

    本篇将详细介绍C#中连接Oracle数据库的方法,包括所需的组件、连接字符串的构建以及使用ADO.NET进行数据操作的基本步骤。 首先,你需要在你的项目中引入Oracle客户端库。Oracle提供了一个名为ODP.NET(Oracle Data ...

    Oracle外连接查询

    Oracle的外连接查询是数据库操作中的重要组成部分,它允许用户获取来自两个或更多表的数据,即使在某些情况下,这些表之间的连接条件不完全匹配。在理解外连接查询之前,我们首先要了解内连接,即最基础的相等连接。...

    SqlDbx连接oracle

    SqlDbx是一款轻量级的数据库管理工具,特别适合于SQL查询和数据库开发。它以其直观的用户界面和对多种数据库系统的支持而受到青睐,包括Oracle...通过理解和配置这些文件,你可以更流畅地在SqlDbx中操作Oracle数据库。

    易语言连接Oracle数据库

    在"oracle连接.e"这个文件中,很可能是包含了一个使用易语言编写的示例程序,演示了如何配置和使用上述组件来实现数据库的连接和数据操作。通过学习和理解这个示例,开发者可以快速掌握易语言与Oracle数据库的交互...

    oracle遇到连接空闲例程

    在Oracle数据库管理与维护过程中,有时会遇到“连接空闲例程”(Idle Connection Routine)的问题。这类问题通常发生在长时间未使用的连接上,由于缺乏活动导致连接被Oracle认为是闲置状态,进而可能引发一系列错误...

Global site tag (gtag.js) - Google Analytics