outline 可以将 sql 语句 select 之后,where 之前的常量参数化,并匹配格式相同但常量值不同的语句吗?

创建outline如下:
CREATE OUTLINE otl2 ON select/+ FULL(man1)/ id+1,name from man where id = 2;

查看 dba_ob_outlines
image

可以看到,前面常量被参数化了。

请问,这个outline 可以匹配
select id+9,name from man where id = 2
这条语句吗

3 个赞

我的理解是可以的

参数化了,应该是一样的吧

可以自行验证下,创建好OUTLINE后执行SQL,查看GV$OB_PLAN_CACHE_PLAN_STAT表看有没有命中

SELECT TENANT_ID,
       SVR_IP,
       PLAN_ID,
       SQL_ID,
       TYPE,
       DB_ID,
       FIRST_LOAD_TIME,
       LAST_ACTIVE_TIME,
       AVG_EXE_USEC,
       SLOWEST_EXE_TIME,
       SLOWEST_EXE_USEC,
       HIT_COUNT,
       EXECUTIONS,
       outline_data,
       IS_BATCHED_MULTI_STMT,
       LEFT(QUERY_SQL, 50) QUERY_SQL
  FROM OCEANBASE.GV$OB_PLAN_CACHE_PLAN_STAT

以下位置的常量不会被参数化,会保留原值:

  • GROUP BY 子句中的常量

  • ORDER BY 子句中的常量

  • CAST 函数的类型参数

  • 日期/时间函数的格式字符串

  • COLLATION 子句
    Outline可以成功匹配

好像是匹配不了啊

使用视图DBA_OB_OUTLINES 与视图OCEANBASE.GV$OB_PLAN_CACHE_PLAN_STAT 进行查看验证!
outline_id 是否相同!