【 生产环境 】
【 OB 】
【 4.2.1.7 】
【问题描述】
SQL1:
SELECT
*
FROM
TABLE
WHERE
did = xxx or phone= xxx
and action in (‘xx’,‘xx’)
and event_time >= xx
and event_time <= xx
SQL2:
SELECT
*
FROM
TABLE
WHERE
(did = xxx or phone= xxx)
and action in (‘xx’,‘xx’)
and event_time >= xx
and event_time <= xx
两个的语义不一样,and和or有优先级的说法。第一个SQL会被翻译成:FROM
TABLE
WHERE
(did = xxx) or (phone= xxx
and action in (‘xx’,‘xx’)
and event_time >= xx
and event_time <= xx)
所以两个是不同的
问题2:同文本同参数同约束的SQL为什么多次执行会出现执行计划不一样的情况?
答:这种情况很少见,要么是计划淘汰了重新生成计划,要么是开了弱读在同机器上缓存了不同的计划,还有可能计划淘汰后重新生成,但在同一时间内针对同一个具体文本库内存在两种不同的计划是不符合预期的
a.查看读策略:show proxyconfig like “%obproxy_read_consistency%”;
b.查看执行计划变化情况
select HIT_COUNT,PLAN_ID,SQL_ID,OUTLINE_ID,FIRST_LOAD_TIME,LAST_ACTIVE_TIME from GV$OB_PLAN_CACHE_PLAN_STAT
where tenant_id= 1016 and query_sql != ‘’
and query_sql like ‘SELECT * FROM xxxx WHERE%’
limit 20