性能优化|关于IMEU与Expression Statistics Store
【云和恩墨,提供7*24最专业的数据恢复(Oracle,MySQL,SQL server)服务,致力于为您的数据库系统做最后一道安全防护!服务热线:010-59007017-7030】数据恢复|数据库运维|性能优化|安全保障|Oracle培训|MySQL培训
ESS简介
Expression Statistics Store (ESS)是Oracle数据库中优化器用于存储表达式评估的统计信息的存储库。它不仅保留在SGA中,同时固定在磁盘上。
ESS是数据库的固定且永久的组件,不能被禁用。它跟IN-MEMORY是独立的,并没有直接关联。无论系统有没有配置In-Memory存储,ESS都会正常地运行。
ESS的主要作用是确定一个表达式是不是足够“hot”(被评选为hot的表达式就是我们所说的In Memory Expressions)。 在数据库进行硬解析的时候,ESS会获取SQL语句的Select语句,where语句,group by语句中使用的表达式并做评估。
如下图所示,在SQL语句中,employees这张表上使用了表达式,优化器会自动收集表达式相关的统计信息,存在一张表里面形成存储库,并对其中的表达式进行各种指标的评估。
1、表达式执行的频率
2、表达式的开销
3、时间戳的评估
优化器会根据开销和执行次数等信息的评估为每一条表达式打分,相当于权重,这个权重并不是非常精确的,而是近似的。通常越活跃的表达式,其分值就越高。这些评分结果ESS会在内部通过一张列表进行统计。
在ESS中被评估为hot的表达式,会作为填充到IMEU中的候选表达式,但系统真正决定哪些表达式会被填充到IMEU当中,事实上是通过DBMS_INMEMORY_ADMIN的包来控制的。
如果在系统中配置了IN-MEMORY存储,系统会将部分热度最高的表达式填充到IMEU中,从而提供更高效的访问。
数据库通过DBMS_INMEMORY_ADMIN包可以控制IM表达式的行为。在这个包中有很多个存储过程,分别实现不同的功能。
(事实上,DBMS_INMEMORY_ADMIN包除了控制IM Expression之外,还负责管理IM FastStart区。这部分我们后面再详细描述。)
其中最主要的两个存储过程如下:
1、存储过程IME_CAPTURE_EXPRESSIONS提示数据库识别并逐渐填充数据库中最热的表达式
2、存储过程IME_POPULATE_EXPRESSIONS强制数据库立即填充表达式。
填充过程如下图所示:
在系统调用IME_CAPTURE_EXPRESSIONS存储过程的时候,就会访问SGA中的ESS,并捕获指定时间段内的访问热度最高的前20个表达式,将其填充到IMEU中,并创建SYS_IME的虚拟列。
时间段可以选择过去24个小时以内的,或者从数据库创建后的任意时间段。一般系统选择的原则是,该表达式设计到的对象至少有部分被填充到了IM Store当中了。也就是对象是满足IN-MEMORY属性的。
如果在上一次调用中,某个处于前20个热度最高的表达式的列表中的项,在这次的调用中并不存在,那么该列的属性将会被设置为No inmemory,这些被标记为No inmemory属性的表达式,会在下次重构的时候被踢出来。
将ESS中热度最高的表达式填充到IMEU需要满足几个条件:
1、初始化参数INMEMORY_EXPRESSIONS_USAGE的值不为 DISABLE。
INMEMORY_EXPRESSIONS_USAGE参数的值有以下四个:
ENABLE - 默认设置,会将动态和静态的IM Expression都填充到到列存储中。
DISABLE - 不进行填充。此时调用IME_CAPTURE_EXPRESSIONS存储过程的时候是不生效的。
STATIC_ONLY - 只填充静态的IM Expression,也就是允许在IM列上存储二进制的JSON对象。在系统内部,二进制的JSON对象被存储为名SYS_IME_OSON的虚拟列;
DYNAMIC_ONLY - 只填充使用频率更高的或被系统标记为'hot'的表达式,在调用IME_CAPTURE_EXPRESSIONS存储过程的时候会自动进行填充。
2、初始化参数INMEMORY_SIZE设置为非0.
3、初始化参数COMPATIBLE必须设置为12.2.0或者更高的值。
COMPATIBLE参数的作用是,当使用较高版本的Oracle时,如果因为特殊需求需要开启旧版本的某些功能,就可以通过将该参数的值调整到合适的版本。默认值是跟数据库当前的版本一致的。