OB_执行计划缓存

发布时间 2023-12-27 09:27:13作者: z_uncle

执行计划缓存淘汰

自动淘汰

如果租户内存大小为10G,并且变量设置如下:

  • ob_plan_cache_percentage = 10;
  • ob_plan_cache_evict_high_percentage = 90;
  • ob_plan_cache_evict_low_percentage = 50;

则:

  • 计划缓存内存上限绝对值 = 10G * 10 / 100 = 1G;
  • 淘汰计划的高水位线 = 1G * 90 / 100 = 0.9G;
  • 淘汰计划的低水位线 = 1G * 50 / 100 = 0.5G;

当该租户在某个server上计划缓存使用超过0.9G时,会触发淘汰,优先淘汰最久没执行的计划
当淘汰到使用内存只有0.5G时,则停止淘汰
如果淘汰速度没有新计划生成速度快,计划缓存使用内存达到内存上限绝对值1G时,将不再往计划缓存中添加新计划,直到淘汰后使用的内存小于1G才会添加新计划到计划缓存中

手动淘汰

ALTER SYSTEM FLUSH PLAN CACHE [tenant_list] [global] 

执行计划缓存失效

1、schema变更,DDL等会造成执行计划失效

2、重新收集统计信息时会造成执行计划失效

3、每日合并时,会重新收集统计信息,每日合并后,执行计划会失效

4、outline绑定执行计划时,会导致sql执行计划失效

 

执行计划缓存使用控制

ob_enable_plan_cache 参数来控制session或者global级别是否使用缓存的执行计划。默认是true,使用计划缓存。

  • 使用 Hint 语句 /+USE_PLAN_CACHE(NONE)/ 表示不使用计划缓存
  • 使用 Hint 语句 /+USE_PLAN_CACHE(DEFAULT)/ 表示使用计划缓存
  •  

计划缓存相关的视图

  • (g)v$plan_cache_stat               记录每个计划缓存的状态,每个计划缓存在该视图中有一条记录。
  • (g)v$plan_cache_plan_stat       记录计划缓存中所有执行计划的具体信息及每个计划总的执行统计信息。
  • (g)v$plan_cache_plan_explain   记录某条 SQL 在计划缓存中的执行计划
  • 计划缓存暂不支持的场景
    l 执行计划所占内存超过 20 MB 时,不会加入计划缓存
    l 如果该计划为分布式执行计划且涉及多个表,不会加入计划缓存