ORACLE 连接方式 NESTED LOOP、HAS…
来源:互联网 发布:可以透视衣服的软件 编辑:程序博客网 时间:2024/05/29 08:58
NESTED LOOP
对于被连接的数据子集较小的情况,nested loop连接是个较好的选择。nestedloop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查找,没有索引一般就不会是 nestedloops。
一般在nested loop中,驱动表满足条件结果集不大,被驱动表的连接字段要有索引,这样就走nstedloop。如果驱动表返回记录太多,就不适合nestedloops了。如果连接字段没有索引,则适合走hashjoin,因为不需要索引。
可用ordered提示来改变CBO默认的驱动表,可用USE_NL(table_name1table_name2)提示来强制使用nested loop。
HASH JOIN
hash join是CBO做大数据集连接时的常用方式。优化器扫描小表(或数据源),利用连接键(也就是根据连接字段计算hash值)在内存中建立hash表,然后扫描大表,每读到一条记录就来探测hash表一次,找出与hash表匹配的行。
当小表可以全部放入内存中,其成本接近全表扫描两个表的成本之和。如果表很大不能完全放入内存,这时优化器会将它分割成若干不同的分区,不能放入内存的部分就把该分区写入磁盘的临时段,此时要有较大的临时段从而尽量提高I/O的性能。临时段中的分区都需要换进内存做hashjoin。这时候成本接近于全表扫描小表+分区数*全表扫描大表的代价和。
至于两个表都进行分区,其好处是可以使用parallelquery,就是多个进程同时对不同的分区进行join,然后再合并。但是复杂。
使用hashjoin时,HASH_AREA_SIZE初始化参数必须足够的大,如果是9i,Oracle建议使用SQL工作区自动管理,设置WORKAREA_SIZE_POLICY为AUTO,然后调整PGA_AGGREGATE_TARGET即可。
以下条件下hash join可能有优势:
两个巨大的表之间的连接。
在一个巨大的表和一个小表之间的连接。
可用ordered提示来改变CBO默认的驱动表,可用USE_HASH(table_name1table_name2)提示来强制使用hash join。
SORT MERGE JOIN
sort mergejoin的操作通常分三步:对连接的每个表做table access full;对table accessfull的结果进行排序;进行merge join对排序结果进行合并。sort mergejoin性能开销几乎都在前两步。一般是在没有索引的情况下,9i开始已经很少出现了,因为其排序成本高,大多为hashjoin替代了。
通常情况下hash join的效果都比sort merge join要好,然而如果行源已经被排过序,在执行sort mergejoin时不需要再排序了,这时sort merge join的性能会优于hash join。
在全表扫描比索引范围扫描再通过rowid进行表访问更可取的情况下,sort merge join会比nestedloops性能更佳。
可用USE_MERGE(table_name1 table_name2)提示强制使用sort merge join。
一般在nested loop中,驱动表满足条件结果集不大,被驱动表的连接字段要有索引,这样就走nstedloop。如果驱动表返回记录太多,就不适合nestedloops了。如果连接字段没有索引,则适合走hashjoin,因为不需要索引。
可用ordered提示来改变CBO默认的驱动表,可用USE_NL(table_name1table_name2)提示来强制使用nested loop。
HASH JOIN
当小表可以全部放入内存中,其成本接近全表扫描两个表的成本之和。如果表很大不能完全放入内存,这时优化器会将它分割成若干不同的分区,不能放入内存的部分就把该分区写入磁盘的临时段,此时要有较大的临时段从而尽量提高I/O的性能。临时段中的分区都需要换进内存做hashjoin。这时候成本接近于全表扫描小表+分区数*全表扫描大表的代价和。
使用hashjoin时,HASH_AREA_SIZE初始化参数必须足够的大,如果是9i,Oracle建议使用SQL工作区自动管理,设置WORKAREA_SIZE_POLICY为AUTO,然后调整PGA_AGGREGATE_TARGET即可。
以下条件下hash join可能有优势:
两个巨大的表之间的连接。
在一个巨大的表和一个小表之间的连接。
可用ordered提示来改变CBO默认的驱动表,可用USE_HASH(table_name1table_name2)提示来强制使用hash join。
SORT MERGE JOIN
通常情况下hash join的效果都比sort merge join要好,然而如果行源已经被排过序,在执行sort mergejoin时不需要再排序了,这时sort merge join的性能会优于hash join。
在全表扫描比索引范围扫描再通过rowid进行表访问更可取的情况下,sort merge join会比nestedloops性能更佳。
可用USE_MERGE(table_name1 table_name2)提示强制使用sort merge join。
0 0
- ORACLE 连接方式 NESTED LOOP、HAS…
- oracle nested table
- Launching New_Configuration has …
- MySQL server has …
- Check a loop in a list with line…
- oracle 左边接 右连接 oracl…
- jdbc 连接 oracle rac
- linux loop device介绍 (转…
- linux loop device介绍 (转…
- Oracle Alerts 与…
- how to do with a slow oracle dat…
- Oracle Database …
- ORACLE:shared memory realm does …
- Oracle Enterprise Pack for Eclip…
- 使用 Oracle Universal Installer …
- Oracle 当前连接数太多 TNS:Liste…
- Oracle natural join(自然连接)
- ORACLE 连接方式 NESTED LOOP、HASH JOIN
- oracle 分析函数dense_rank()
- JSP注释
- js 输出当前时间 (即时变化…
- 关于oracle时间转换格式问题
- 常见Oracle HINT的用法
- ORACLE 连接方式 NESTED LOOP、HAS…
- oracle sqlldr使用心得
- C++内存模型和名称空间总结
- java多态小结
- Oracle工具使用(export,import,sql…
- java List 排序 Collections.sort()
- oracle中的exists 和not exists 用…
- Nutch与Lucene区别
- java正则表达式应用