共享池在数据库中可以说是相当重要动力资源,关系着数据库的性能瓶颈。
什么是共享池呢?
共享池是内存结构中SGA(系统全局区)的一部分,包含了:库缓冲区、数据字典缓冲区、服务器结果缓冲区、预留池,也是着四个区组成了共享池,这四个区的功能就是共享池的功能。
库缓冲区
共享SQL区:存放执行计划和解析树,当用户执行一条SQL语句时,共享池会根据SQL语句的复杂程度分出一定的内存给用户,当用户再次执行相同的SQL语句时,不必再次进行解析,提高执行语句的执行效率。类似于古代将领带兵打仗,皇帝就是用户,把将领当成共享池,将领带大家走的路就是SQL语句,不用再自己摸索路线。
私有SQL区:里面主要存了一些SQL语句的环境设置,比如SQL语句的一些绑定变量、环境和会话参数,还有PL/SQL程序包的局部变量、全局变量和包变量。共享池里一个SQL语句的共享SQL区能被多个私有SQL区共有。即很多人能同时走这条路。
数据字典缓冲区
数据字典存在于SYSTEM表空间中,数据库中访问最频繁的就是它了,里面有表、视图等信息,数据库会借助数据字典对SQL语句进行解析,它分为两个部分存放,一部分以行(ROW)的方式存在数据字典缓冲区中,另一部分以块(BLOCK)的方式存放在库缓冲区中,这两个部分共同组成数据字典缓冲区,并被所有的用户进程共享。
服务器结果缓冲区
这也是共享池里显目的一点,将所有正确的SQL查询和函数结果缓存到服务器结果缓冲区里, 当多个用户执行相同的SQL语句时,只要它有过一次解析和执行计划,那么速度是与第一次完全不通档次的。
服务器结果缓冲区和数据库高速缓冲区有所区别,前者是缓冲到共享池里,不经过任何加工;后者需从磁盘读到内存,也就是经过加工。
预留池
如果有大片连续的内存分配,都会优先选择预留池。
共享池在不同的服务器模式下还有不同的结构
当数据库处于专有服务器模式时,库缓冲区里只有共享SQL区,私有SQL区和UGA被分到程序全局区里;但处于共享服务器模式下,库缓冲区包含了私有SQL区,共享池里也有了UGA(用户全局区)。
总的来说,共享池就是SQL语句的专属区域,划分内存区域-->SQL语句的解析-->生成解析树-->制定执行计划-->返回查询结果-->被所有的用户进程共享这条SQL语句的执行计划和结果。
什么是数据库高速缓冲区?
为了避免数据库等待磁盘I/O,Oracle设计了数据库高速缓冲区,暂时存放用户执行查询语句时从数据文件(磁盘)读取出来的数据,避免了直接对磁盘I/O,并被当前实例的其他用户共享。
共享池和数据库高速缓冲区密切相关,共享池存放SQL语句的来龙去脉,数据库高速缓冲区是磁盘和内存之间的容器,每个查询都是要先访问共享池再到这个容器。数据库高速缓冲区里包含了保持池,回收池和默认池
可以看下面这个图了解下数据库高速缓冲区。
当发生SQL查询时,在共享池的服务器结果缓冲区里找不到结果,那么就会到数据库高速缓冲区里查找,如果有,则产生缓冲命中(Cache Hit),读取保持池,否则产生缓冲失误(Cache Miss),可能会读取默认池或者回收池,还有一种情况,如果在数据库高速缓冲区里找了很久,直到临界点,那么就会通知DBWn进程,将回收池里的脏缓冲器写入磁盘,再将默认池里的空闲缓冲器转移到回收池,变为脏缓冲器。
可想而知,一个SQL语句的执行过程大致如下:
欢迎大家指正!