s。
Shared SQL Area ( 共享SQL区)
每个运行过的sql,都会存在下列SQL区:
·Shared SQL area(共享SQL区)
数据库使用sharedSQL area处理SQL语句的第一次发生时。这个区对所有用户来说都是可以访问的,包含了语句的解析树和执行计划。一条语句,只有一个shared sql area存在。
·Private SQL area(私有SQL区)
每个会话 执行一个SQL语句,它自己的PGA中都会有一个对应的privateSQL area。每个用户提交了相同语句,这些private SQL area会指向一个相同的shared SQL area。因此,会有很多private SQL area存在不同的PGA中,它们和相同的shared SQL area关联。
当应用提交相似的sql语句时,数据库会自动判断,数据库会同时考虑 SQL由用户(应用)直接发布的,以及其他语句执行时内部调用的递归SQL
数据库执行以下步骤:
1、 检查shared pool中看是否有语法和语义都完全相等的shared area exists:
O 如果一个完全相等的语句存在,那么数据库直接使用这个shared SQL area,这样会减少内存的消耗
O 如果一个完全相等的语句不存在,那么数据库将分配一个新的 shared SQL area到shared pool。如果一个语法(字面)相同,但是不同语义(权限之类)的话,将使用一个child cursor(子cursor)。
在这两个case中,用户的private SQL area 指向包含语句和执行计划的 Shared SQL area。
2、给该会话分配一个private SQLarea
PrivateSQL area的位置取决于session所建立的连接,如果session通过 shared server模式连接,那么private SQL area的部分将保存在SGA
下图显示dedicated server(独占模式)时,两个session复制同一个SQL 语句到它们自己的PGA中的体系结构图。在shared server模式时,这个复制将在UGA中,它将在large pool或shared pool(large pool没有时)。
Program Units and the Library Cache(程序单元和Library Cache)
Library cache 持有可执行PL/SQL程序,Javaclasses的可执行版本,这些项目统称为程序单元。
数据库处理程序单元的方法和SQL语句很相似。举个例子,数据库分配一个shared area还持有编译和解析过的PL/SQL程序。数据库分配一个private area去持有运行这个program的所有指定的值,包括local,global,包中的变量,以及SQL执行时的buffers。如果多个用户执行相同的program,那么每个用户自己维护一个单独的private SQL area(它获取session特定的值,以及指向相同的shared SQL area)
PL/SQL program中的SQL语句会分别单独执行,这些SQL语句各自使用一个sharedarea持有它们解析过后的版本,以及每个运行PL/SQL的session会有自己的private area。
Allocation and Reuse of Memory in the Shared Pool(sharedpool中内存的分配和重用)
当一个新的SQL语句解析,数据库会分配shared pool 内存,内存的大小依赖于复杂的语句。
正常情况下,shared pool中的一个item 会一直停留,直到它根据LRU算法被移除。数据库允许shared pool中的items被多个session使用,即使创建它的session停止了,它也依然会被保留。这个机制最小化了处理SQL的消耗。
如果新的item需要空间,那么数据库会释放不经常被使用的item。一个shared SQL area可能被移除,哪怕它关联一个打开但很一段时间没用的cursor。如果打开的cursor随后又要使用,那么数据库将重新解析语句,并且分配一个新的shared SQL area。
数据库在下面情况同样可以移除shared SQL area:
·如果一个表,table cluster,索引的统计信息重新收集,那么默认情况下数据库会逐渐(有一个时间周期)移除和该对象关联的所有语句的shared SQL area.在移除后,语句又运行了,那么数据库将把它解析到一个新的shared SQL area(根据相应对象最新的统计信息)
·如果一个SQL语句引用了一个schema object,而且这个对象之后被DDL修改过,那么数据库将把相关shared SQL area置为失效,下次执行时,优化器必须重新解析这个语句
·如果你改变了global database name,那么数据库将把shared pool中的所有信息都清除
你可以使用ALTER SYSTEM FLUSH SHARED_POOL语句去手动把shared pool中信息都移除,用来评估instance刚重启后的性能
Data Dictionary Cache
Data dictionary 是系统表、视图的集合,包含和数据库相关的信息(结构,用户等信息)。Oracle数据库在SQL执行时会频繁访问数据字典。
Oracle数据库访问数据字典特别频繁,所以指定了下面这些特别的内存位置来存放数据字典信息:
·Data dictionary cache
这个cache将持有和数据库objects相关的信息。这个cache也同样被称之为rowcache,因为它持有的是数据是行,而不是 buffers(块)。
·Library cache
所有的服务进程可以共享使用这些cache 来访问数据字典的信息。
Server Result Cache
和buffer cache pool不同,server result cache中放置的是结果集,而不是数据块。Server result cache包含SQL query result cache 以及PL/SQL functionresult cache。它们的基础结构相同。
Client result cache会和serverresult cache不同,一个client cache是在应用级别设置的,以及是存放在client端的内存里的(不是服务器端的内存)
SQL query result cache
数据库可以存储查询或查询片段的结果到SQL query result cache。将这些结果提供给未来的查询和查询片段。大多数应用都在这个性能提高手段中获益。
举个例子,假设一个应用重复的跑一个SELECT 语句,如果结果被cache到内存中,那么数据库立即把它们返回。在这种情况下,数据库避免的重新读取块,以及重新计算结果集等昂贵操作。当有事务修改了相关对象的数据或者元数据(DDL)数据库会将结果集立即置为失效状态。
用户可以通过 RESULT_CACHE hint来注释一个查询,或查询判断,标明数据库应该将结果存储到SQL query result cache。初始化参数RESULT_CACHE_MODE可以决定是否对所有查询(只要有可能)都使用SQL query result cache,还是仅仅只对h