实例的内存结构:前三项是必须有的,后三项是可选的
1、the database buffer cache:执行SQL语句的区域:用户需要的所有数据都要在这里获得,如果没有就需要先从硬盘拷贝到这个区域中,修改后的数据也先存放在此区域,在特定的时间存入硬盘中;
2、the log buffer
3、the shared pool
4、a large pool:
在共享服务器进程中,会使用到large pool;
并行执行服务也用用到large pool;
一些I/O操作也会用到large pool:比如rman的往磁带上的备份过程;
如果这时没有large pool存在,这些过程就会使用shared pool,这样会造成性能损失;
5、a java pool:我们所写的java代码并不是缓存在javapool中的,而是缓存在shared pool中的;
6、a stream pool
Streams的原理就是从redolog中抽取变更的部分,然后重构这些语句,再将重构的语句在远端的服务器上执行。Stream pool就是为实现上述动作提供的内存
在三个必须的内存结构中,只用log buffer是不能动态调整的,并且更改大小需要重启instance才能生效;
如果从redo buffer中写redo logs到磁盘时瓶颈的话,解决方法就是使用RAC,这样就可以有多个LGWR并行执行写操作;
log buffer是是一个静态值,修改它后必须重启instance才能生效,不能动态更改;
Shared pool有四个组成部分
1.、the library cache:已解析过的形式存储最近刚刚执行过的代码;它的作用是避免重复解析,节省解析所花时间;
2、the data dictionary cache:存储进行用到的对象的结构定义;
3、the PL/SQL area:存储过程,函数,触发器等pl/sql对象;
4、the SQL query and PL/SQL function resultcache:存储近期已经执行过的语句的结果集,避免重复执行语句;默认情况下,这个功能是不可用的;
在Shared pool中使用的算法是LRU(least recently used)
SQL代码解析的过程包括:
1、分析:对哪个表执行,它是表,还是同义词、视图等待,它有哪些列,用户是否有权限
2、执行:是按索引进行,还是进行全表扫描;
匿名PL/SQL是用户执行的,没有存储在数据字典中的存储过程,它的效率比较低,每次都要动态编译执行;