一、针对慢SQL分析定位时,有多种方法,可以分析执行计划,看ET等分析判断哪个操作符耗时较长。然而对于我来说,我习惯先从SQL本身入手,分段去看SQL到底在哪个环节执行效率较低。如下SQL语句,经过分段定位,发现该SQL语句慢在OR查询条件这个地方。
二、针对OR条件的优化,看一下参数OPTIMIZER_OR_NBEXP。
简介:控制 OR 表达式的优化,可取值为 0、1、2、4、8、16 及这些值的组合值
属性:会话级,同时支持 HINT 指定
缺省值:0
OPTIMIZER_OR_NBEXP 取不同值对应 OR 表达式不同的优化处理,具体如下:
✓ 0:不进行优化;
✓ 1:扩展 OR 条件,加入 LNNVL 函数,使用 UNION ALL 方式实现;
✓ 2:OR 条件作为整体处理;
✓ 4:相关子查询中的 OR 表达式作为整体处理;
✓ 8:对于形如(b1 AND b2) OR (b3 AND b4)的表达式,其中都是对同一个列的常量过滤,进行合并处理;
✓ 16:对于形如 COL1 OPS CONST OR COL1 IS NULL 的表达式,进行合并,计划生成阶段生成 UNION ALL,避免 UNION FOR OR 的去重处理。
三、针对该SQL特性,我们使用HINT语法/+OPTIMIZER_OR_NBEXP(2)/,把OR 条件作为整体处理;
四、经过测试该条SQL语句总的有150行,原SQL语句执行耗时要5秒钟左右,经过使用HINT语法/+OPTIMIZER_OR_NBEXP(2)/,把OR 条件作为整体处理;优化后SQL语句执行效率由5秒提高到0.5秒。优化后查询效率得到大幅度提升,提高了10倍!具体的业务场景,可以尝试使用HINT语法带入不同的参数值试探获得最优的查询效率;
文章
阅读量
获赞