他的回复:
报名读书会《SQL优化核心思想》Oracle的Cost计算公式单块读耗时:IO寻道寻址耗时+块大小/IO传输速度,典型的估算值:10+8K/4K=12ms多块读耗时IO寻道寻址耗时+db_file_multiblock_count*块大小/IO传输速度,SQL优化的核心思想就是想方设法减少SQL的物理I/O次数(不管是单块读次数还是多块读次数)徐老师还说,可以理解为减少sql 扫描的数据块数。即使有缓存,减少块的扫描次数也可以降低CPU的占用。read by other session等待这个等待事件其实是oracle IO问题一个比较尴尬的场景,会话a在进行把磁盘上的数据块读到内存(data buffer cache)中这个操作,会话b,会话c 同时也请求这个数据块。因为会话a还完全读入内存(data buffer cache),就导致了b,c read by other session。一般情况下组合索引的 引导列 是基数高的列列基数太低,而且没有收集直方图,CBO认为该列数据分布是均衡的,导致在估算Rows的时候,直接以表总行数/列基数来进行估算套循环内表的索引一定要包含连接列,如果只有过滤条件的索引就不应该选择嵌套循环,因为内表同样的数据要被扫描很多遍,不如选择hash join优化SQL需要注意表与表之间关系,分页语句只能对一个表的列进行排序, 而且排序列上应覆盖索引分页查询:查询Top 10的EMPt表的数据,要求按照工资降序。select 的列应避免在列上进行表达式。小表与大表关联,如果大表连接列基数比较高,可以走嵌套循环,让小表驱动大表,大表走连接列的索引加materialize提示:Oracle会先将查询结果写入一张临时表,然再查询临时表。WITH AS:就是将一个子查询部分独立出来,有时候是为了提高SQL语句的可读性,有时候是为了提高SQL语句性能。如果一个SQL语句中,某个表会被访问多次,而且每次访问的限制条件一样的话,就可以使用with as来提高性能。注意:如果with as 短语没有被调用2次以上,CBO就不会将with as短语获取的数据放入temp表,如果想要将数据放入temp表需要使用materialize hintOracle10g,where子查询中有主表的过滤条件,在not exists子查询中添加HINT:HASH_AJ无法更改执行计划。我们可以将not exists改写为“外连接+子表连接列is null”的形式,让其走HASH连接如果SQL语句本身没有绑定变量,但是执行计划中谓词过滤信息又有绑定变量(:B1,:B2,B3..),这说明有绑定变量这步需要传值。典型的需要传值的有标量子查询、Filter以及树形查询中start with 子查询。当执行计划中某个步骤需要传值,这个步骤就会被扫描多次。分区索引:如果过滤条件中有分区字段,一般都创建本地索引。如果过滤条件中没有分区字段,一般都创建global索引,如果这时创建成local索引,会扫描所有的索引分区,分区数量越多,性能下降越明显。假设有1 000个分区,在进行索引扫描的时候会扫描1 000个索引分区,此时相比global索引,会额外多读取至少1 000个索引块。NO.3:推荐朋友参与读书会:将任意读书会链接分享或活动海报(上方竖图)到≥10人的群或朋友圈,截图