SQL语句WHERE条件里面有大量的OR条件,有时查询效率较低,针对OR条件的优化,有以下几个思路可以尝试一下。
一、SQL改写,可以把SQL语句里面的or查询条件,改写为union all查询语句替换;
二、可以使用or查询优化参数,根据经验适当的进行hint优化;
DROP TABLE T1;
DROP TABLE T2;
CREATE TABLE T1(C1 INT,C2 INT,C3 INT);
CREATE TABLE T2(D1 INT,D2 INT,D3 INT);
CREATE INDEX IT1C1 ON T1(C1);
执行下面的语句,OPTIMIZER_OR_NBEXP 为 0,使用 UNION FOR OR 处理 OR 表达式,然后通过 ROWID 去掉重复数据
EXPLAIN SELECT /*+ OPTIMIZER_OR_NBEXP(0) */ * FROM T1 WHERE C1=1 OR C2=5;
现在将 OPTIMIZER_OR_NBEXP 置为 2,执行相同的语句。此时 OR 表达式作为 T1 的整体过滤条件处理。
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语句片段,然后在针对性的进行处理即可。如果定位到是因为or条件导致的SQL执行性能较差。可以使用hint方式修改OPTIMIZER_OR_NBEXP参数值尝试解决;具体优化方法可以参考《参数OPTIMIZER_OR_NBEXP对or表达式的优化实践案例》
访问网址:https://eco.dameng.com/community/post/20230216145614MZ0HL17NA5MQ95Q7VJ
文章
阅读量
获赞