执行计划缓存(Plan Cache)用于减少执行计划的生成次数。
OceanBase 数据库会缓存之前生成的执行计划,以便在下次执行该 SQL 时直接使用,可以避免反复执行,从而优化执行过程,这种策略被称为“Optimize Once”,即“一次优化”。
计划缓存是一个典型的 Key-Value 结构,Key 就是参数化后的 SQL 字符串,Value 就是该条 SQL 所对应的执行计划。
每个租户在每一台服务器上都有一个独立的计划缓存,用以缓存在此服务器上处理过的 SQL 计划。在 OceanBase 数据库的计划缓存中,SQL 的执行计划可以分为本地计划、远程计划和分布式计划三种类型。在计划缓存中,同一条 SQL 根据其需要访问的数据不同,可能同时具有三种执行计划。
对于一条 SQL 的一种执行计划,OceanBase 数据库默认只会保留第一次执行 SQL 时生成的计划;但在某些情况下,同一条 SQL 的参数值可能会影响到执行计划的选择,所以计划缓存会根据需要,为不同的参数值保留不同的执行计划,从而保证每次执行时可以使用最合适的计划。
计划缓存的淘汰是指将执行计划从计划缓存中删除,减少计划缓存对内存的使用。OceanBase 数据库支持自动淘汰和手动淘汰两种方式。
自动淘汰是指当计划缓存占用的内存达到了需要淘汰计划的内存上限(即淘汰计划的高水位线)时,对计划缓存中的计划执行自动淘汰。
plan_cache_evict_interval
设置)系统会自动检查不同租户在不同服务器上的计划缓存,并判断是否需要执行计划淘汰。如果某个计划缓存占用的内存超过该租户设置的淘汰计划的高水位线,则会触发计划缓存淘汰。
plan_cache_evict_interval
ob_plan_cache_percentage
ob_plan_cache_percentage
/100
ob_plan_cache_evict_high_percentage
/100
ob_plan_cache_evict_low_percentage
ob_plan_cache_evict_low_percentage
/100例如,租户内存大小为 10 G,各参数值设置如下:
ob_plan_cache_percentage
=10ob_plan_cache_evict_high_percentage
=90ob_plan_cache_evict_low_percentage
=50则计算得出:
由计算结果可知,当该租户在某个服务器上计划缓存使用超过 0.9 G 时,会触发淘汰,优先淘汰最久没执行的计划,当淘汰到使用内存只有 0.5 G 时,则停止淘汰。 如果淘汰速度没有新计划生成速度快,计划缓存使用内存达到内存上限绝对值 1 G 时,将不在往计划缓存中添加新计划,直到执行淘汰后所占内存小于 1 G 才会添加新计划到计划缓存中。
手动淘汰是指强制将计划缓存中计划进行删除。现在支持指定不同租户对应的当前服务器或全部服务器中计划缓存全部删除,具体命令如下:
obclient>ALTER SYSTEM FLUSH PLAN CACHE [tenant_list] [global]
其中 tenant_list 和 global 为可选字段,使用说明如下:
计划缓存中执行计划可能因为各种原因而失效,这时需要将计划缓存中失效计划进行刷新,即将该执行计划删除后重新优化生成计划再加入计划缓存。
如下场景会导致执行计划失效,需要对执行计划进行刷新:
计划缓存可以使用系统变量及 HINT 实现使用控制。
ob_enable_plan_cache
设置为 TURE 时,表示 SQL 请求可以使用计划缓存;设置为 FALSE 时,表示 SQL 请求不使用计划缓存。默认为 TURE。此系统变量可被设置为 SESSION 级别或者 GLOBAL 级别。
/+USE_PLAN_CACHE(NONE)/
表示不使用计划缓存。/+USE_PLAN_CACHE(DEFAULT)/
表示使用计划缓存。执行计划相关视图包括:
(g)v$plan_cache_stat
记录每个计划缓存的状态,每个计划缓存在该视图中有一条记录。(g)v$plan_cache_plan_stat
记录计划缓存中所有执行计划的具体信息及每个计划总的执行统计信息。(g)v$plan_cache_plan_explain
记录某条 SQL 在计划缓存中的执行计划。有关视图的详细参数信息,请参考 计划缓存相关视图。
SuppressWarnings@Target({TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})@Retention(SOURCE)public @interface Sup...
ProtocolFamilypublic interface ProtocolFamily代表一系列通信协议。方法总结修饰符和类型方法描述Stringname()返回协议族的名...
IDNjava.lang.Object |---java.net.IDNpublic final class IDNextends Object提供在普通 Unicode 表示和 ASCII 兼容编码 (ACE) ...
NetPermissionjava.lang.Object |---java.security.Permission |---|---java.security.BasicPermission |---|---|---java.net.Ne...
URLConnectionjava.lang.Object |---java.net.URLConnectionpublic abstract class URLConnectionextends Object抽象类 URLConne...
Setpublic interface SetEextends CollectionE不包含重复元素的集合。 更正式地说,集合不包含一对元素 e1 和 e2 使得 e1.equals...
AbstractCollectionjava.lang.Object |---java.util.AbstractCollectionEpublic abstract class AbstractCollectionEextends Obj...
ArrayDequejava.lang.Object |---java.util.AbstractCollectionE |---|---java.util.ArrayDequeEpublic class ArrayDequeEextend...