优化Oracle实例

时间:2009-02-20 22:11:17

标签: oracle

我正在与一个开发适用于SQL Server和Oracle的应用程序的团队合作。

SQL Server具有实例的概念,可以容纳多个数据库。 Oracle 10g每个数据库需要一个实例(并且可以允许更多冗余),因此对于我们运行的每个数据库,我们都有一组完全独立的进程,因此内存使用量更大。

正因为如此,我们开始更多地使用一个具有单独模式的实例。但是,我们仍然希望将单独的客户(或开发机器)数据分开。

我们的大多数实例都是使用本地开发的脚本创建的(例如,在Windows上使用oradim)。

可以采取哪些措施来减少Oracle实例的内存使用要求,占用空间等,以便多个实例可以在一台计算机上安全运行? Linux或Windows是更好的主机吗?我们可以通过禁用我们不需要的额外功能(数据挖掘,Oracle Text等)来轻松获得收益吗?

7 个答案:

答案 0 :(得分:2)

内存恕我直言是Oracle表现最重要的。

运行多个数据库意味着保留多组缓存SQLPL/SQL,系统表的多个数据缓存等。

如果您只需要将数据分开,则可以为不同的用户创建不同的TABLESPACES。你仍然需要分享LOGFILES

禁用Data Mining等额外功能对您没什么帮助,因为它们在不使用时不占用内存。

你肯定需要降低任何内存值,但是如果没有看到数据库设计,就很难分清你应该保留哪些以及需要降低哪些值。

作为非常不精确的经验法则,如果您拥有OLTP数据库,即小表和高并发性,您可能应该牺牲sort_area_size和{{ 1}},但保持hash_area_size尽可能高。

如果您使用db_block_buffersHASH JOINS的大型表格,则需要MERGE JOINSsort_area_size才能进行有效的连接和排序,但您可以减少{{1}因为你无论如何也无法缓存这些表。

hash_area_sizedb_block_buffersLinux效果方面差异不大。不过,Windows会让Oracle感到满意。 Linux也试图这样做,但可以在艰难的记忆条件下换掉。

答案 1 :(得分:1)

内存消耗将来自以下几个方面:

  1. 每个实例SGA
  2. 每会话UGA,PGA(排序等)
  3. 杂项。上面没有涉及的其他每进程内存要求(例如每个oracle进程使用的堆栈和堆,实际可执行映像使用的内存等)。
  4. 1的成本是值得的,以便让开发者和客户不要互相攻击缓冲区缓存。那些不关心这些事情的实例应该合并。

    您可以假设所有RDBMS以某种形式支付的成本为2(并且仅仅是您的RDBMS配置的函数),因此这不是权衡。

    我估计,由于fork and page sharing,因此在Linux上最好减少3的影响,因此您只需支付使用的费用。在现代* nix系统中,从CPU和内存的角度来看,fork而不是多线程方法非常有效,同时提供许多其他优势(您几乎不需要担心内存泄漏。)


    已经说过,不要忘记Windows的任务管理器或来自top的内存读数可能误导了进程的实际内存消耗,因为“重复计算”:共享内存段为以及实际的oracle可执行文件和动态链接库的大小可以为每个进程计算,而实际上所有进程共享(并且仅使用一次)内存。在Unix下使用“pmem”或“cat / proc // maps”来查看进程实际使用了多少内存以及共享多少内存。

答案 2 :(得分:1)

如果您使用的是Oracle 11g,则MEMORY_TARGET是您要设置的参数。

http://download.oracle.com/docs/cd/B28359_01/server.111/b28320/initparams133.htm

当您向同一服务器添加更多数据库实例时,您需要在所有其他实例上向下调整此参数,以便您不会在服务器上使用太多内存并导致它交换。在Oracle 10g上,设置PGA_AGGREGATE_TARGET和SGA_TARGET。

http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/initparams157.htm

不幸的是,您添加的Oracle实例越多,调整越困难,系统越慢。

关于Windows与Linux,我真的没有太多信息。

答案 3 :(得分:1)

如果您的主要目标是分离客户端数据,则无需运行多个实例。您可以实现两种类型的分离。通过将每个客户端放在一个单独的模式中,您已经实现了第一个逻辑分离。要物理分隔数据,请为每个客户端创建一个表空间。表空间是一组实际的数据库文件。通过使用它们,您可以控制数据的物理存储位置。在为客户端创建架构时,将客户端的表空间指定为“默认表空间”。

除非你想在同一台服务器上运行不同版本的Oracle,否则很少有理由启动多个实例。为了充分利用单个实例,尽可能多地在内存中使用它,并使用TOAD或附带的Oracle工具等工具来优化各种Oracle进程的内存分配。

答案 4 :(得分:1)

如果您有单独的架构,则可以将不同客户的数据分开。为什么需要更多实例?每台机器一个实例最适合产品环境。

对于开发环境,您可以做出不同的选择。但是应该将开发环境和生产环境分开。

答案 5 :(得分:1)

同意'每个服务器一个实例'的概念。 如果您希望为某些用户提供优先处理,或者确保每个应用程序都能获得数据库的相当一部分,请查看资源管理和配置文件。

http://download.oracle.com/docs/cd/B19306_01/network.102/b14266/admusers.htm#i1012785

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_2007.htm#sthref4352

http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/dbrm.htm#ADMIN027

将数据保存在单独的模式中(以及物理级别的表空间)应确保客户数据的适当分离。只要你不在模式之间共享表空间,tt变得(相对)微不足道的是使用导出和可传输的表空间来提取和分离出单个模式,这样你就可以在数据库(以及实例)之间移动它们,如果随后需要的话他们在自己的服务器上。

答案 6 :(得分:1)

您可以为服务器添加内存吗?您可以以低于1000美元的价格购买32 GB的内存。