设为首页 加入收藏

TOP

11GConcepts(翻译第十四章)MemoryArchitecture(内存体系结构)(五)
2014-11-24 01:08:03 来源: 作者: 【 】 浏览:105
Tags:11GConcepts 翻译 十四 MemoryArchitecture 内存 体系结构
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

首页 上一页 2 3 4 5 6 下一页 尾页 5/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇禁止以操作系统认证方式登录数据库 下一篇全面解析Oracle数据库的系统和对..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: