大型池大小设置 oracle,合理设置共享池的大小

在所有的数据库中往往都有权限的控制,Oracle数据库也不例外。当用户访问某个数据库对象时,Oracle数据库系统就会检查这个用户是否有访问这个数据对象的权限。注意,此时数据库系统并不会从硬盘中读取用户的权限信息。而是在内存中的一个叫做共享池的地方,去读取相关的信息。因为从内存中读取信息要比从硬盘中读取信息快几千倍,所以这个权限的检查工作也会快几千倍。那么用户的等待时间就会短许多。从而提高数据库的性能。这都是数据库的共享池技术在起作用。但是如果共享池的大小不足以容纳这么多的内容,那么数据库只能够从硬盘中读取相关的数据,这就会大大的降低数据库的性能。为此这个共享池的大小跟数据缓存的大小一样的重要。

一、共享池大小对数据库性能的影响。

在共享池中保存了最近执行的SQL语句、PL/SQL 程序和数据库字段信息,是对SQL语句和PL/SQL程序进行分析、编译、执行的内存区域。根据其用途的不同,共享池又分为库缓存与数据字典缓存两部分。

数据库系统在执行用户或者客户端提交的各种SQL语句(包括应用程序代码中包含的SQL语句)、PL/SQL程序之前,会先进行语法分析,看其是否符合语法规则;然后会进行权限的确认,看其是否具有相关的权限;最后还会对其进行优化,以达到更好的查询性能;最终生成执行计划。毋庸置疑,这一系列的操作需要耗用一定的资源,并需要花费一定的时间。如果用户在每次执行类似的SQL语句或者程序时,都需要经过这个过程,那显然对系统的性能影响会比较大。如用户在第一次执行时,能够将这些内容保存在内存中,在下次执行相同SQL语句或者PL/SQL程序时(可能只是参数不同),系统能够省去这些步骤,而直接执行。那无疑就可以提高数据库的性能。现在这个Oracle数据库的库缓存就可以达到这个目的。在库缓存中,保存了最近解析过的SQL语句和PL/SQL程序。当数据库系统接收到用户传送过来的SQL语句或者程序时,系统在执行他们之前,会先在库缓存中进行搜索,查看他们以前是否被解析过。如果没有,就会进行语法分析、权限审查、查询优化等等一系列的操作。如果有的话,那么系统就直接利用库缓存中的解析结果与执行计划来直接执行,而不必再重复的对他们进行解析。从而明显提高数据库的性能。

在系统的数据字典中,存储着数据库对象的相关信息。包括对象的名字、访问权限等等。在数据库运行过程中,系统需要频繁的访问这些信息,以确定用户访问的数据库对象是否存在,用户是否具有相关的权限等等。但是如果每次需要用到这些信息的时候,都从硬盘中的数据文件中去读取这些信息,显然效率并不高。为了提高访问的效率,数据库系统会在共享池的数据字典缓存中保存最常使用的数据字典信息。包括数据库的对象、用户权限等等。由于共享池是一个共享的区域,所以多个例程可以共享里面的内容。这在某种程度上,也减少了共享池空间的大小。

由于访问内存的效率要比访问硬盘的效率高出几千倍。为此通过库缓存或者数据字典缓存的方式,可以明显提高数据库的性能。但是如果共享池的空间比较小,不足以容纳足够多的数据。那么会产生什么结果呢?共享池中最新的内容会覆盖相对来说比较旧的内容。从而共享池中的命中率不会很高。如对于SQL语句来说,用户下次需要使用的时候,这个SQL语句的解析结果已经被其他SQL语句覆盖掉了。此时这个共享池就起不到应有的作用。为此从数据库的性能出发,需要给共享池设置一个合适的大小。

二、给共享池设置一个合适的大小。

既然共享池太小会影响数据库的性能。那么共享池该设置为多大合适呢?这没有一个确切的数值。因为系统中记录的多少、SQL语句的规范性、数据库的用途等等都会影响到这个值。为此只有根据企业的实际应用,才能够判断设置多少共享池是合适的。

不过在谈论这个话题之前,笔者想多说一句,即规范性的SQL语句对库缓存池的影响。笔者认为,在设计SQL语句的时候,如果能够遵守一些规范性的要求,并且通过变量来传递用户的参数,那么就可以大大的节省库缓存池的空间。如现在有很多个用户需要查询产品表中的信息,他们需要的内容虽然不同,但是采用的SQL语句可以设置为相同。可以用过变量的形式来传递用户的参数,控制结果的显示。如此的话,在库缓冲池中只保留了一条SQL语句的解析结果,从而节省了共享池的空间。而且还可以提高其命中率。笔者这是要告诉大家,有时候一味的增加数据库共享池的大小,而不注意SQL语句或者程序的规范性,其效果不会很明显。如果SQL语句不规范或者没有合适采用变量的话,那么共享池即使设置的最大,也无济于事。相反,只有两者并重,最后才能够起到事半功倍的效果。

在判断是否需要对共享池大小进行调整,那么数据库管理员首先需要知道,现在共享池的使用情况。如现在用户的操作,数据库系统多少是从共享池中获取信息。或者说,有多少次没有成功从共享池中获取信息。如果数据库管理员能够得知这些信息,那么就可以在任何情况下判断是否需要调整共享池的大小。庆幸的是,在Oracle数据字典中,给我们统计了这些信息。在数据字典V$ROWCACHE中,就保留了相关的信息。不过这个数据字典中只是一些分散的数据。管理员需要使用一些汇总语句对他们进行汇总,才最终可以查询到共享池中数据字段缓存的成功与失败的次数。具体的语句如下:

Select sum(gets) success,sum(getmisses) faile from v$rowcache;

其中success表示读取某一类数据字典时成功的次数。Faile表示读取某一类数据字典时失败的次数。一般来说,success的值越大,faile的值越少,那么就越好。这说明数据库系统在运行时,从共享池中读取的内容多,而从硬盘的数据文件中读取的内容比较少。从而数据库的性能比较佳。如果faile的值比较大,甚至超过了success的值,那就说明,系统从硬盘中读取的内容要比从共享池中读取的内容多。由于系统访问硬盘的效率要比访问内存地效率低几千倍,为此此时会很大程度上影响数据库的性能。此时如果通过调整共享池的大小,来降低faile的值,那么就可以在很大程度上提高数据库的性能。

三、调整shared_pool_size的大小。

在Oracle数据库中,共享池的大小是由初始化参数share_pool_size决定的。管理员在维护数据库共享池大小的时候,最好能够先查看一下这个参数,以确定数据库当前的共享池大小。默认情况下,这个值为80M。管理员可以根据实际情况,如当前内存的使用率来进行调整。

在调整的过程中,笔者建议最好采取逐步调整的过程。即不需要一下子把这个值调整的很大。而是可以每次5M或者10M的进行调整。然后查看调整后的效果。这或许对数据库管理员来说,会有一个更加直观的印象。这个参数是一个动态参数,即可以在数据库运行期间直接修改这个参数,会立即生效。所以说,分次分步进行更改是可行的,因为不需要重新启动数据库。不过需要注意的一点是,如果只是更改了这个参数内存中的值,则在下次重新启动的时候,这个修改后的值就会丢失。因为其没有保存在初始化文件中。为此在使用语句更改这个值的时候,最后使用相关的选项,让系统同时更改内存中与初始化文件中的值。从而在下次数据库服务器重新启动后,这个设置仍然有效。而不需要每次重新启动都进行类似的调整。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值