Oracle 表连接优化

合集下载

oracle多表连接查询性能优化

oracle多表连接查询性能优化

原始SQL语句如下:select *from (select c.product_name,a.prd_inst_name, prd_state,a.accept_date, basic_state,a.evolution_pty_id,decode(a.if_prepay, 1, '是', '否') prepay,a.install_addr,a.install_date,a.service_nbr,a.ofr_id, ofr_name,d.cust_name,rownum numfrom crm_tb_prd_prd_inst a,crm_tb_prd_prd c,crm_tb_pty_cust d,m_prd_inst_stas m,m_prd_inst_base_state m1,m_prdmark_inst_base_state m2,ext_crm_tb_prd_prd_inst extwhere a.prd_id = c.product_idand m.gwm_fid(+) = a.prd_inst_stas_idand m1.basic_state(+) = a.basic_stateand m2.ofr_id(+) = a.ofr_idand a.prd_inst_id(+) = ext.prd_inst_idand d.cust_id(+) = a.own_cust_idand ext.building_fid = 693253and rownum <= 10)where num > 0;数据库中,a、c、d 三张表中数据十万数量级,每查询一次,时间约为75s。

查询表结构,发现a表关联的m表的外键ofr_id ,m1表的外键basic_state,d表的外键own_cust_id均无索引,为其添加索引。

索引添加后,执行速度提升为53s左右,效果仍不明显。

Oracle中表的连接及其调整

Oracle中表的连接及其调整

Oracle中表的连接及其调整只有对这些问题有了清晰的理解后,我们才能针对特定的查询需求选择合适的连接方式,开发出健壮的数据库应用程序。

选择合适的表连接方法对SQL语句运行的性能有着至关重要的影响。

下面我们就Oracle常用的一些连接方法及适用情景做一个简单的介绍。

常用的表连接方式:a.嵌套循环连接(Nested Loop)b.排序合并连接(Sort Merge)c. 哈希连接(Hash join)一、嵌套循环连接(Nested Loop)嵌套循环连接的工作方式是这样的:1、Oracle首先选择一张表作为连接的驱动表,这张表也称为外部表(Outer Table)。

由驱动表进行驱动连接的表或数据源称为内部表(Inner Table)。

2、提取驱动表中符合条件的记录,与被驱动表的连接列进行关联查询符合条件的记录。

在这个过程中,Oracle首先提取驱动表中符合条件的第一条记录,再与内部表的连接列进行关联查询相应的记录行。

在关联查询的过程中,Oracle 会持续提取驱动表中其他符合条件的记录与内部表关联查询。

这两个过程是并行进行的,因此嵌套循环连接返回前几条记录的速度是非常快的。

在这里需要说明的是,由于Oracle最小的IO单位为单个数据块,因此在这个过程中Oracle会首先提取驱动表中符合条件的单个数据块中的所有行,再与内部表进行关联连接查询的,然后提取下一个数据块中的记录持续地循环连接下去。

当然,如果单行记录跨越多个数据块的话,就是一次单条记录进行关联查询的。

3、嵌套循环连接的过程如下所示:我们可以看出这里面存在着两个循环,一个是外部循环,提取驱动表中符合条件的每条记录。

另外一个是内部循环,根据外循环中提取的每条记录对内部表进行连接查询相应的记录。

由于这两个循环是嵌套进行的,故此种连接方法称为嵌套循环连接。

嵌套循环连接适用于查询的选择性强、约束性高并且仅返回小部分记录的结果集。

通常要求驱动表的记录(符合条件的记录,通常通过高效的索引访问)较少,且被驱动表连接列有唯一索引或者选择性强的非唯一索引时,嵌套循环连接的效率是比较高的。

oracle多表连接查询性能优化

oracle多表连接查询性能优化

原始SQL语句如下:select *from (select c.product_name,a.prd_inst_name, prd_state,a.accept_date, basic_state,a.evolution_pty_id,decode(a.if_prepay, 1, '是', '否') prepay,a.install_addr,a.install_date,a.service_nbr,a.ofr_id, ofr_name,d.cust_name,rownum numfrom crm_tb_prd_prd_inst a,crm_tb_prd_prd c,crm_tb_pty_cust d,m_prd_inst_stas m,m_prd_inst_base_state m1,m_prdmark_inst_base_state m2,ext_crm_tb_prd_prd_inst extwhere a.prd_id = c.product_idand m.gwm_fid(+) = a.prd_inst_stas_idand m1.basic_state(+) = a.basic_stateand m2.ofr_id(+) = a.ofr_idand a.prd_inst_id(+) = ext.prd_inst_idand d.cust_id(+) = a.own_cust_idand ext.building_fid = 693253and rownum <= 10)where num > 0;数据库中,a、c、d 三张表中数据十万数量级,每查询一次,时间约为75s。

查询表结构,发现a表关联的m表的外键ofr_id ,m1表的外键basic_state,d表的外键own_cust_id均无索引,为其添加索引。

索引添加后,执行速度提升为53s左右,效果仍不明显。

34种Oracle性能优化的方法

34种Oracle性能优化的方法

34种Oracle性能优化的方法1、选择最有效率的表名顺序(只在基于规则的优化器中有效):ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。

如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.2、WHERE子句中的连接顺序:ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.3、SELECT子句中避免使用‘ * ‘:ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间4、减少访问数据库的次数:ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等;5、在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE 参数, 可以增加每次数据库访问的检索数据量 ,建议值为2006、使用DECODE函数来减少处理时间:使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.7、整合简单,无关联的数据库访问:如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)8、删除重复记录:最高效的删除重复记录方法 ( 因为使用了ROWID)例子:DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)FROM EMP X WHERE X.EMP_NO = E.EMP_NO);9、用TRUNCATE替代DELETE:当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)10、尽量多使用COMMIT:只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:COMMIT所释放的资源:a. 回滚段上用于恢复数据的信息.b. 被程序语句获得的锁c. redo log buffer 中的空间d. ORACLE为管理上述3种资源中的内部花费11、用Where子句替换HAVING子句:避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销. (非oracle中)on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后,因为on是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,按理说应该速度是最快的,where也应该比having快点的,因为它过滤数据后才进行sum,在两个表联接时才用on的,所以在一个表的时候,就剩下where跟having比较了。

常见Oracle数据库优化策略与方法

常见Oracle数据库优化策略与方法

常见Oracle数据库优化策略与方法
Oracle数据库优化是提高数据库性能的关键步骤,可以采取多种策略。

以下是一些常见的Oracle数据库优化策略:
1.硬件优化:这是最基本的优化方式。

通过升级硬件,比如增加RAM、使用
更快的磁盘、使用更强大的CPU等,可以极大地提升Oracle数据库的性能。

2.网络优化:通过优化网络连接,减少网络延迟,可以提高远程查询的效率。

3.查询优化:对SQL查询进行优化,使其更快地执行。

这包括使用更有效的
查询计划,减少全表扫描,以及使用索引等。

4.表分区:对大表进行分区可以提高查询效率。

分区可以将一个大表分成多
个小表,每个小表可以单独存储和查询。

5.数据库参数优化:调整Oracle数据库的参数设置,使其适应工作负载,可
以提高性能。

例如,调整内存分配,可以提升缓存性能。

6.数据库设计优化:例如,规范化可以减少数据冗余,而反规范化则可以提
升查询性能。

7.索引优化:创建和维护索引是提高查询性能的重要手段。

但过多的索引可
能会降低写操作的性能,因此需要权衡。

8.并行处理:对于大型查询和批量操作,可以使用并行处理来提高性能。

9.日志文件优化:适当调整日志文件的配置,可以提高恢复速度和性能。

10.监控和调优:使用Oracle提供的工具和技术监控数据库性能,定期进行性
能检查和调优。

请注意,这些策略并非一成不变,需要根据实际情况进行调整。

在进行优化时,务必先备份数据和配置,以防万一。

oracle sql优化面试题

oracle sql优化面试题

oracle sql优化面试题1. 介绍SQL优化的重要性(约200字)在大规模数据处理和复杂查询的背景下,SQL优化在提高性能和效率方面起到至关重要的作用。

通过优化SQL查询语句,我们可以减少数据库的负载,提升查询速度,提高系统的响应能力和用户体验。

SQL优化能够帮助我们减少不必要的计算和IO操作,从而减少系统资源的消耗,提高系统的稳定性和可用性。

因此,了解并掌握SQL优化技巧对于数据库开发和管理人员来说是非常重要的。

2. 查询优化相关的基本概念和知识(约400字)2.1 索引的使用索引是优化查询性能的重要手段之一。

在表中创建适当的索引可以加快查询速度。

需要注意的是,索引的创建需要根据具体的查询需求和数据特征进行选择。

索引字段应该选择在查询中使用频率较高的列,并且避免过多的索引,以免增加维护成本。

2.2 SQL语句的编写与书写风格合理的SQL语句编写和书写风格能够提高查询性能。

应避免使用通配符查询,尽量使用具体的条件进行查询。

同时,避免使用SQL中的函数,尽量使用简单的操作符,减少不必要的计算和转换操作。

2.3 数据库范式设计合理的数据库范式设计可以减少冗余数据,提高数据查询的效率。

通过将数据分解为多个关联的表,可以避免数据重复,从而减少在查询过程中对重复数据的计算和传输。

3. SQL优化常见问题和解决方案(约800字)3.1 查询中的表连接优化当查询需要多个表之间进行连接时,选择合适的连接类型是重要的。

根据数据量和查询结果的大小,可以选择INNER JOIN、LEFT JOIN或者RIGHT JOIN等连接方式。

另外,可以考虑对经常进行连接操作的字段添加索引,加快连接过程。

3.2 子查询的优化子查询在某些情况下可以帮助我们实现复杂的查询逻辑,但是过多的子查询会增加系统的负载和查询时间。

为了优化子查询,可以考虑将子查询转换为连接查询、使用临时表或者使用WITH语句。

3.3 适当使用优化器提示Oracle数据库提供了优化器提示(Hint)功能,可以手动控制查询语句的执行计划。

oracle sql优化常用的15种方法

oracle sql优化常用的15种方法

oracle sql优化常用的15种方法1. 使用合适的索引索引是提高查询性能的重要手段。

在设计表结构时,根据查询需求和数据特点合理地添加索引。

可以通过创建单列索引、复合索引或者位图索引等方式来优化SQL查询。

2. 确保SQL语句逻辑正确SQL语句的逻辑错误可能会导致低效查询。

因此,在编写SQL语句前,需要仔细分析查询条件,确保逻辑正确性。

3. 使用连接替代子查询在一些场景下,使用连接(JOIN)操作可以替代子查询,从而减少查询的复杂度。

连接操作能够将多个数据集合合并为一个结果集,避免多次查询和表的扫描操作。

4. 避免使用通配符查询通配符查询(如LIKE '%value%')在一些情况下可能导致全表扫描,性能低下。

尽量使用前缀匹配(LIKE 'value%')或者使用全文索引进行模糊查询。

5. 注意选择合适的数据类型选择合适的数据类型有助于提高SQL查询的效率。

对于整型数据,尽量使用小范围的数据类型,如TINYINT、SMALLINT等。

对于字符串数据,使用CHAR字段而不是VARCHAR,可以避免存储长度不一致带来的性能问题。

6. 优化查询计划查询计划是数据库在执行SQL查询时生成的执行计划。

通过使用EXPLAIN PLAN命令或者查询计划工具,可以分析查询计划,找出性能瓶颈所在,并对其进行优化。

7. 减少磁盘IO磁盘IO是影响查询性能的重要因素之一。

可以通过增加内存缓存区(如SGA)、使用高速磁盘(如SSD)、使用合适的文件系统(如ASM)等方式来减少磁盘IO。

8. 分区表对于大数据量的表,可以考虑使用分区表进行查询优化。

分区表可以将数据按照某个规则分散到不同的存储区域,从而减少查询范围和加速查询。

9. 批量操作尽量使用批量操作而不是逐条操作,可以减少数据库的事务处理开销,提高SQL执行效率。

可以使用INSERT INTO SELECT、UPDATE、DELETE等批量操作语句来实现。

oracle优化方案

oracle优化方案

Oracle优化方案引言在使用Oracle数据库时,为了提高性能和效率,我们需要对数据库进行优化。

本文将介绍一些常用的Oracle优化方案,包括索引优化、SQL优化、统计信息优化等。

索引优化索引是提高数据库查询性能的重要手段之一。

以下是一些优化索引的方法:1. 创建合适的索引在设计表结构时,应该通过分析和了解业务需求,选择合适的列创建索引。

常见的索引类型包括B树索引、位图索引等。

2. 考虑联合索引联合索引是指多个列组合在一起创建的索引。

在某些情况下,使用联合索引可以提高查询速度。

但是需要注意,联合索引过多或列顺序不当会导致索引失效。

3. 避免使用过多的索引虽然索引可以提高查询性能,但是过多的索引会增加写操作的开销,并且会占用更多的存储空间。

因此,应该根据实际情况,避免创建过多的索引。

4. 定期维护索引定期检查和维护索引是保证索引效率的重要步骤。

可以通过重建索引、收集统计信息等方法来优化索引性能。

SQL优化SQL查询是Oracle数据库最常用的操作之一。

以下是一些优化SQL查询的方法:1. 减少不必要的查询避免在查询中使用不必要的表,减少不必要的连接操作,可以大幅提高查询性能。

2. 使用正确的查询方式在编写SQL查询时,应该选择合适的查询方式。

常用的查询方式有嵌套查询、子查询、联接等。

根据实际情况选择最合适的查询方式,可以减少数据量和运算量,提高查询速度。

3. 优化WHERE条件在查询语句中,应该尽量避免使用通配符查询(如%)、使用函数在WHERE条件中进行运算,因为这样会导致全表扫描,影响查询性能。

4. 使用分页查询当查询结果集较大时,可以考虑使用分页查询。

通过limit和offset来限制查询结果的返回范围,可以减少数据的传输和处理,提高查询效率。

统计信息优化Oracle数据库中的统计信息对查询优化器的决策至关重要。

以下是一些优化统计信息的方法:1. 收集统计信息及时收集和更新表的统计信息是保证数据库查询性能稳定的重要步骤。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

优化SQL的另一种思维5 ORACLE的执行计划之表之间的连接优化SQL的另一种思维系列文章是作者用了快一年的时间完成的SQL优化文章,它的原理实际上是通过分析SQL语句的执行计划来实现对整体SQL进行优化的,这是多年项目经验的总结,由于考虑到目前国内的Oracle部署还基本维持在Oracle 8 和Oracle 9的水平上,所以里面的模拟环境都是在Oracle 8.3下进行的,希望可以针对性更强一些。

本文是系列连载的第五章:ORACLE的执行计划中表之间的连接篇。

《优化SQL的另一种思维》目录一、性能调整综述二、有效的应用设计三、SQL语句处理的过程四、ORACLE的优化器五、ORACLE的执行计划背景知识访问路径(方法) -- access path表之间的连接如何产生执行计划如何分析执行计划如何干预执行计划 - - 使用hints提示具体测试实例具体案例分析六、其它注意事项七、整体实例分析客户端程序优化SQL步骤tkprof程序整体实例解说【IT专家网独家】Join是一种试图将两个表结合在一起的谓词,一次只能连接2个表,表连接也可以被称为表关联。

在后面的叙述中,我们将会使用”row source”来代替”表”,因为使用row source更严谨一些,并且将参与连接的2个row source分别称为row source1和row source 2。

Join过程的各个步骤经常是串行操作,即使相关的row source 可以被并行访问,即可以并行的读取做join连接的两个row source的数据,但是在将表中符合限制条件的数据读入到内存形成row source后,join的其它步骤一般是串行的。

有多种方法可以将2个表连接起来,当然每种方法都有自己的优缺点,每种连接类型只有在特定的条件下才会发挥出其最大优势。

row source(表)之间的连接顺序对于查询的效率有非常大的影响。

通过首先存取特定的表,即将该表作为驱动表,这样可以先应用某些限制条件,从而得到一个较小的row source,使连接的效率较高,这也就是我们常说的要先执行限制条件的原因。

一般是在将表读入内存时,应用where子句中对该表的限制条件。

根据2个row source的连接条件的中操作符的不同,可以将连接分为等值连接(如WHERE A.COL3 = B.COL4)、非等值连接(WHERE A.COL3 > B.COL4)、外连接(WHERE A.COL3 = B.COL4(+))。

上面的各个连接的连接原理都基本一样,所以为了简单期间,下面以等值连接为例进行介绍。

在后面的介绍中,都已:SELECT A.COL1, B.COL2FROM A, BWHERE A.COL3 = B.COL4;为例进行说明,假设A表为Row Soruce1,则其对应的连接操作关联列为COL 3;B 表为Row Soruce2,则其对应的连接操作关联列为COL 4;连接类型:目前为止,无论连接操作符如何,典型的连接类型共有3种:∙排序- - 合并连接(Sort Merge Join (SMJ) )∙嵌套循环(Nested Loops (NL) )∙哈希连接(Hash Join)排序- - 合并连接(Sort Merge Join, SMJ)内部连接过程:1) 首先生成row source1需要的数据,然后对这些数据按照连接操作关联列(如A.col3)进行排序。

2) 随后生成row source2需要的数据,然后对这些数据按照与sort source1对应的连接操作关联列(如B.col4)进行排序。

3) 最后两边已排序的行被放在一起执行合并操作,即将2个row source按照连接条件连接起来下面是连接步骤的图形表示:MERGE/ \SORT SORT| |Row Source 1 Row Source 2如果row source已经在连接关联列上被排序,则该连接操作就不需要再进行sort操作,这样可以大大提高这种连接操作的连接速度,因为排序是个极其费资源的操作,特别是对于较大的表。

预先排序的row source包括已经被索引的列(如a.col3或b.col4上有索引)或row source已经在前面的步骤中被排序了。

尽管合并两个row source的过程是串行的,但是可以并行访问这两个row source(如并行读入数据,并行排序).SMJ连接的例子:SQL> explain plan forselect /*+ ordered */ e.deptno, d.deptnofrom emp e, dept dwhere e.deptno = d.deptnoorder by e.deptno, d.deptno;Query Plan-------------------------------------SELECT STATEMENT [CHOOSE] Cost=17MERGE JOINSORT JOINTABLE ACCESS FULL EMP [ANALYZED]SORT JOINTABLE ACCESS FULL DEPT [ANALYZED]排序是一个费时、费资源的操作,特别对于大表。

基于这个原因,SMJ经常不是一个特别有效的连接方法,但是如果2个row source都已经预先排序,则这种连接方法的效率也是蛮高的。

嵌套循环(Nested Loops, NL)这个连接方法有驱动表(外部表)的概念。

其实,该连接过程就是一个2层嵌套循环,所以外层循环的次数越少越好,这也就是我们为什么将小表或返回较小row source的表作为驱动表(用于外层循环)的理论依据。

但是这个理论只是一般指导原则,因为遵循这个理论并不能总保证使语句产生的I/O次数最少。

有时不遵守这个理论依据,反而会获得更好的效率。

如果使用这种方法,决定使用哪个表作为驱动表很重要。

有时如果驱动表选择不正确,将会导致语句的性能很差、很差。

内部连接过程:Row source1的Row 1 -------------- -- Probe ->Row source 2Row source1的Row 2 -------------- -- Probe ->Row source 2Row source1的Row 3 -------------- -- Probe ->Row source 2…….Row source1的Row n -------------- -- Probe ->Row source 2 从内部连接过程来看,需要用row source1中的每一行,去匹配row source2中的所有行,所以此时保持row source1尽可能的小与高效的访问row source2(一般通过索引实现)是影响这个连接效率的关键问题。

这只是理论指导原则,目的是使整个连接操作产生最少的物理I/O次数,而且如果遵守这个原则,一般也会使总的物理I/O数最少。

但是如果不遵从这个指导原则,反而能用更少的物理I/O实现连接操作,那尽管违反指导原则吧!因为最少的物理I/O次数才是我们应该遵从的真正的指导原则,在后面的具体案例分析中就给出这样的例子。

在上面的连接过程中,我们称Row source1为驱动表或外部表。

Row Source2被称为被探查表或内部表。

在NESTED LOOPS连接中,Oracle读取row source1中的每一行,然后在row sourc2中检查是否有匹配的行,所有被匹配的行都被放到结果集中,然后处理row source1中的下一行。

这个过程一直继续,直到row source1中的所有行都被处理。

这是从连接操作中可以得到第一个匹配行的最快的方法之一,这种类型的连接可以用在需要快速响应的语句中,以响应速度为主要目标。

如果driving row source(外部表)比较小,并且在inner row source(内部表)上有唯一索引,或有高选择性非唯一索引时,使用这种方法可以得到较好的效率。

NESTED LOOPS 有其它连接方法没有的的一个优点是:可以先返回已经连接的行,而不必等待所有的连接操作处理完才返回数据,这可以实现快速的响应时间。

如果不使用并行操作,最好的驱动表是那些应用了where 限制条件后,可以返回较少行数据的的表,所以大表也可能称为驱动表,关键看限制条件。

对于并行查询,我们经常选择大表作为驱动表,因为大表可以充分利用并行功能。

当然,有时对查询使用并行操作并不一定会比查询不使用并行操作效率高,因为最后可能每个表只有很少的行符合限制条件,而且还要看你的硬件配置是否可以支持并行(如是否有多个CPU,多个硬盘控制器),所以要具体问题具体对待。

NL连接的例子:SQL> explain plan forselect a.dnam e,b.sqlfrom dept a,emp bwhere a.deptno = b.deptno;Query Plan-------------------------SELECT STATEMENT [CHOOSE] Cost=5NESTED LOOPSTABLE ACCESS FULL DEPT [ANALYZED]TABLE ACCESS FULL EMP [ANALYZED]哈希连接(Hash Join, HJ)这种连接是在oracle 7.3以后引入的,从理论上来说比NL与SMJ更高效,而且只用在CBO优化器中。

较小的row source被用来构建hash table与bitmap,第2个row source被用来被hansed,并与第一个row source生成的hash table进行匹配,以便进行进一步的连接。

Bitmap被用来作为一种比较快的查找方法,来检查在hash table中是否有匹配的行。

特别的,当hash table比较大而不能全部容纳在内存中时,这种查找方法更为有用。

这种连接方法也有NL连接中所谓的驱动表的概念,被构建为hash table与bitmap的表为驱动表,当被构建的hash table与bitmap能被容纳在内存中时,这种连接方式的效率极高。

HASH连接的例子:SQL> explain plan forselect /*+ use_hash(emp) */ em pnofrom emp, deptwhere emp.deptno = dept.deptno;Query Plan----------------------------SELECT STATEMENT [CHOOSE] Cost=3HASH JOINTABLE ACCESS FULL DEPTTABLE ACCESS FULL EMP要使哈希连接有效,需要设置HASH_JOIN_ENABLED=TRUE,缺省情况下该参数为TRUE,另外,不要忘了还要设置hash_area_size参数,以使哈希连接高效运行,因为哈希连接会在该参数指定大小的内存中运行,过小的参数会使哈希连接的性能比其他连接方式还要低。

相关文档
最新文档