您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息
三六零分类信息网 > 庆阳分类信息网,免费分类信息发布

面试官:说说Oracle数据库result cache的原理是什么?

2019/7/27 3:48:33发布175次查看
概述前面已经用实验给大家介绍了result cache相关内容,今天主要讨论一下oracle 11g result cache的深层原理。
从参数看,oracle提供了client result cache和server result cache两种机制。
client result cache和server result cacheoracle的result cache参数就是表示server端的cache功能。server result cache是在oracle sga中的shared pool里面一块内存池。这个memory pool包括两个组成部分,或者说包括两种缓存内容,就是sql语句的查询结果和pl/sql函数的返回值结果。server result cache功能的初衷,就是为了缓解一些系统长期高频度的访问某些“稳定性好”的数据。
当启用result cache的时候,oracle的工作流程是这样的。首先,如果result_cache_mode参数是manual,表示只有在使用result_cache和no_result_cache参数的时候,才能启用result cache功能。
oracle解析到sql语句使用了hint后,就回到缓存中查找相应的记录。如果不存在对应的结果集信息,oracle就会真正执行这个sql语句,附带将结果以一个id保存在shared pool的cache pool中。第二次相同sql到来之后,就会发现与现有id的一致性,将结果直接返回。
应该说,oracle的result cache是消除逻辑读,更进一步的缓存策略。但是,所有的缓存都存在一个相同的问题,就是冗余数据(cache)的一致性。
从目前分析看,oracle是借助对象之间的“依赖”关系来做到数据同步。首先,我们看一个系列例子:
sql> conn scott/tiger;
sql> create table t_tab as select * from dba_tables;
sql> select /*+result_cache*/count(*) from t_tab, t where t.owner=t_tab.owner and t.object_name=t_tab.table_name;
sql> col name for a30;
sql> select id, type, status, name, row_count from v$result_cache_objects;
上面操作涉及到两个对象t和t_tab。我们从v$result_cache_objects视图中,可以看到,oracle不仅仅将那个结果集合(type=result)保存下来,而且将两个数据表的信息保存下来,作为“dependency”关系。
从前面的实验,我们可以知道,一旦发生数据表t和t_tab的任何变化,包括数据dml变化操作,两个缓存的依赖对象就会失效,从而引发result cache结果集合的失效。注意:这个依赖是非常敏感的,即使是权限变化这样的小事,都会引起cache的失效。
sql> grant select on t to hr;
sql> select id, type, status, name, row_count from v$result_cache_objects;
那么,字面值(sql语句结构)对缓存有影响吗?
sql> select /*+result_cache*/count(*) from t_tab, t where t.owner=t_tab.owner and t.object_name=t_tab.table_name;
--新成立一个result cache
sql> select id, type, status, name, row_count from v$result_cache_objects;
--交换位置
sql> select /*+result_cache*/count(*) from t, t_tab where t.owner=t_tab.owner and t.object_name=t_tab.table_name;
sql> select id, type, status, name, row_count from v$result_cache_objects;
当sql语句结构变化比较大的时候,result cache是不会共用的。
下面聊聊client result cache。client result cache全名为oracle call interface(oci)client result cache。client result cache主要是为了基于oci的应用程序,每一个client result cache是在一个应用程序中的,所有这个process的会话,都会共享这个result cache。
注意:client result cache和server result cache是完全不同的两个特点。相互之间没有关系。
oci client result cache是直接在客户端建立缓存,适用于occi,jdbc oci和odp.net应用程序。oci client result cache最直接的好处就是减少数据库相应和资源消耗,提高整体应用体验。
对数据失效的问题,oracle一旦发现依赖对象的失效,就会反向向客户端发送信息,引起client cache的失效。
result cache的相关参数解析result cache的功能是通过oracle一系列加入的参数来进行控制的。本部分介绍一下oracle result cache所使用的参数信息。
server result cache是主体,默认result cache在sga中是有一块区域pool的,通过hint result_cache和no_result_cache来控制。从shared_pool中,我们可以看到当前result cache的信息。
sql> select * from v$sgastat where lower(name) like %result_cache%;
sql> show parameter result_cache
参数说明:
相对于传统的oracle内存池,在自动调整时代,oracle是怎么管理result cache大小呢?在启动的时候,根据不同的情况设置,oracle会选择出cache pool的大小。
当设置memory_target的时候,oracle会将result cache的大小设置为target值的0.25%。如果没有设置memory_target参数,只设置了sga_target,这个大小为0.5%。如果设置了shard_pool_size参数,这个算法的参数值为1%。
从参数上看,我们可以看到,对于每个result cache记录,oracle都是有保留的。并不是所有结果集合都会被记录。当result cache pool达到设置了本身的限制之后,比可用空间大的结果集合,都不会被缓存。
result cache pool自身使用的是lru算法,将结果age out出去。在rac环境下,每个实例instance都可以设置自己的result cache大小。
result cache模式在诸多的result cache相关参数中,result cache mode是一个重要的开关参数。这个参数控制着当前oracle是否使用客户端和服务器端result cache功能。
在之前的文章中,我们讨论了result cache的特性。其中最大引起我们关注的就是cache对象失效机制,只要查询“依赖”的基础数据表发生了变化,包括表结构、数据和授权关系,cache缓存对象就会失效。频繁的cache构建和失效、再次构建失效,要消耗很多cpu和内存空间。所以,从oracle的角度看:应用程序sql查询主要对于只读(read-only)对象或者变化较小(read-mostly)的数据库对象。
初始化参数result_cache_mode用来控制result cache功能的开启工作模式,默认是manual。
manual表示sql语句只有在显示的使用hint result_cache的情况下,才会启用cache功能。与manual对应的取值是force,force的含义是说,无论何时,都会对所有sql启用result cache功能,除非sql中显示出现了no_result_cache的hint标记。
明显的,result_cache对所有sql开启是一个不合理的设计。所以,我们通常只要开启默认值manual就好了。
后面会分享更多devops和dba方面的内容,感兴趣的朋友可以关注一下~

庆阳分类信息网,免费分类信息发布

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录