9 join方法--优化主题系列

来源:互联网 发布:三维立体设计软件 编辑:程序博客网 时间:2024/06/05 08:45

出个题目:在一个高并发环境下SQL优化重要不??为什么??

假设在没有并发的情况下一个SQL逻辑读是1000并不大对吧

假设现在有50个并发是不是很容易产生CR block??而且很多个??

此时是不是有可能50个并发会修改1000block中的500block??

此时的逻辑读是不是由1000变成几万了??况且仅仅是一个SQL

50个并发没提交只能从UNDO里面读数据现在修改了500个块50*500+500

也就是说在高并发的环境下 SQL优化非常重要

高并发环境下逻辑读可能是普通情况下的10倍以上

 

同一个时刻能不能3个表进行JOIN??

 

(结果集)与表(结果集)之间的连接方式非常重要,如果CBO选择了错误的连接方式,本来几秒就能出结果的SQL可能跑一天都跑不完。如果想要快速定位超大型SQL性能问题,就必须深入理解表连接方式。在多表JOIN的时候,只能是2个表先JOINJOIN之后的结果再和其他表/结果集关联,也就是说任何时候都是只能2个表在做JOIN


什么情况下不走NL??

首先HASH JOIN是不是都只扫描1次??

HASH JOIN被驱动表只扫描一次??

假设被驱动表 10GB 多块读16 块大小8KB要进行多少次I/O能读完??

如果FULLTABLE ACCESS??

10*1024*1024/16/8=8W 多次I/O对不对??

现在我们来走NL 是不是要走索引??

走索引扫描的I/O次数小于8WNL就合适如果超过8W就错了

但是走 NL是单块读

假设索引的块里面存放100条一个块高度是38W*100/2是不是也很大??

 

带着如上疑问,下面分章节介绍

普通连接:嵌套循环(NESTEDLOOP)、哈希连接(HASHJOIN)、排序合并连接(SORTMERGE JOIN)

特殊连接:笛卡尔积(CARTESIAN)、外连接(hashjoin outer)、半连接(semi-join)、反连接(anti-join)


原创粉丝点击