出个题目:在一个高并发环境下SQL优化重要不??为什么??
假设在没有并发的情况下一个SQL逻辑读是1000 并不大对吧
假设现在有50个并发是不是很容易产生CR block??而且很多个??
此时是不是有可能50个并发会修改1000个block中的500个block??
此时的逻辑读是不是由1000变成几万了??况且仅仅是一个SQL
有50个并发没提交只能从UNDO里面读数据现在修改了500个块50*500+500
也就是说在高并发的环境下 SQL优化非常重要
高并发环境下逻辑读可能是普通情况下的10倍以上
同一个时刻能不能3个表进行JOIN??
表(结果集)与表(结果集)之间的连接方式非常重要,如果CBO选择了错误的连接方式,本来几秒就能出结果的SQL可能跑一天都跑不完。如果想要快速定位超大型SQL性能问题,就必须深入理解表连接方式。在多表JOIN的时候,只能是2个表先JOIN,JOIN之后的结果再和其他表/结果集关联,也就是说任何时候都是只能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次数小于8W次走NL就合适如果超过8W次就错了
但是走 NL是单块读
假设索引的块里面存放100条一个块高度是38W*100/2 是不是也很大??
带着如上疑问,下面分章节介绍
普通连接:嵌套循环(NESTEDLOOP)、哈希连接(HASHJOIN)、排序合并连接(SORTMERGE JOIN)及
特殊连接:笛卡尔积(CARTESIAN)、外连接(hashjoin outer)、半连接(semi-join)、反连接(anti-join)。