2009-02-20 62 views
3

我正在與一個開發可在SQL Server和Oracle上工作的應用程序的團隊合作。優化Oracle實例

SQL Server有一個實例的概念,可以容納多個數據庫。 Oracle 10g每個數據庫需要一個實例(並且可以允許更多冗餘),因此對於我們運行的每個數據庫,我們都有一套完全獨立的進程,因此內存使用量更大。

正因爲如此,我們已經開始轉向更多具有單獨模式的實例。但是,我們仍然希望將單獨的客戶(或開發機器)數據分開。

我們的大多數實例都是使用本地開發的腳本創建的(例如,Windows上的oradim)。

可以做些什麼來減少Oracle實例的內存使用需求,佔用空間等,以便多個實例可以在一臺機器上安全地運行? Linux或Windows是更好的主機?我們是否可以通過禁用我們不需要的額外功能(數據挖掘,Oracle Text等)來輕鬆獲得收益?

回答

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沒有太多的瞭解。

2

內存恕我直言是Oracle性能最重要的。

運行多個數據庫意味着保持多套緩存SQLPL/SQL,系統表的多個數據緩存等

,如果你只需要保持數據分開的,可以爲不同的用戶創建不同的TABLESPACES。儘管如此,你仍然必須分享LOGFILES

禁用諸如​​之類的附加功能對您沒有多大幫助,因爲它們在不使用時不消耗內存。

您當然需要降低任何內存值,但很難判斷您應該保留哪些值,以及在不看到數據庫設計的情況下需要降低哪些值。

根據經驗非常不精確規則,如果你有OLTP數據庫,這是小桌子和併發的高層次,你應該犧牲sort_area_sizehash_area_size,但保持db_block_buffers儘可能高。

如果您在使用HASH JOINSMERGE JOINS大表,你需要sort_area_sizehash_area_size高效連接和排序,但是可以減少db_block_buffers,因爲你不能就能夠反正緩存這些表。

LinuxWindowsOracle方面的表現差異不大。 Linux,但是,增益LOCK_SGAWindows也試圖做到這一點,但可以在艱難的記憶條件下換掉。

+0

也許我從OP得到了錯誤的印象,但我認爲他可能想從調整細粒度的MEMORY_TARGET與各種細粒度參數(sort_area_size,hash_area_size ...)開始。調整MEMORY_TARGET可能會讓他足夠遠。 – RussellH 2009-02-21 00:07:48

+0

我可以減少內存限制,但是我希望能夠減少內存使用量,使其不會超出限制。 :)如果簡單的方法不起作用,我願意接受所有建議,並樂意進一步深入探討。 – crb 2009-02-21 19:03:28

+0

您是否嘗試過使用這些參數進行試驗? Oracle可能會預先分配比您真正需要的更大的SGA。 – RussellH 2009-02-22 01:01:58

1

內存消耗將來自以下幾個方面:

  1. 每實例SGA
  2. 每會話UGA,PGA(分選等)
  3. 雜項。上面未涉及的其他每進程內存需求(例如,每個oracle進程使用的堆棧和堆,實際可執行映像使用的內存等等)

1的成本是值得的,以防止dev和客戶抖動對方的緩衝區緩存。那些不關心這些事情的實例應該被合併。

您可以假設所有RDBMS(並且完全是您的RDBMS配置的函數)以某種形式支付2的成本,所以這不是一種折衷。

由於fork and page sharing,我估計3的影響最好在Linux上減少,所以你只支付你使用的費用。在現代的* nix系統中,從CPU和內存的角度來看,fork-instead-of-multithreaded方法是非常高效的,同時還提供許多其他優點(您幾乎不需要擔心內存泄漏)。


這些已經說過了,不要忘記,從Windows的任務管理器或從top的內存讀數可能誤導進程的實際內存消耗,因爲「雙重計數」:共享內存段以及當實際上所涉及的所有進程共享(並且僅使用一次)存儲器時,實際的oracle可執行文件和動態鏈接庫可以針對每個進程被計數。在Unix下使用「pmem」或「cat/proc // maps」來查看進程實際使用了多少內存以及共享多少內存。

1

如果您的主要目標是分離客戶端數據,則不需要運行多個實例。有兩種分離方式可以實現。通過將每個客戶端放在單獨的模式中,您已經實現了第一個邏輯分離。要物理分離數據,請爲每個客戶端創建一個表空間。表空間是實際數據庫文件的分組。通過使用它們,您可以控制數據的物理存儲位置。當您爲客戶端創建模式時,將客戶端的表空間分配爲「默認表空間」。

除非你想要在同一臺服務器上運行不同版本的Oracle,否則很少有理由啓動多個實例。爲了充分利用您的單一實例,儘可能多地在內存中使用它,並使用TOAD或所包含的Oracle工具等工具來優化爲各種Oracle進程分配內存。

1

如果您有單獨的模式,您將單獨客戶的數據分開。爲什麼需要更多的實例?每臺機器一個實例最適合於產品環境。

對於開發環境,您可以做出不同的選擇。但是開發環境和生產環境應該是分開的。

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就變得(相對)使用導出和可傳輸表空間來提取和分離出單獨的模式(相對),所以你可以在數據庫之間移動它們(因此也可以在後面有必要的情況下)他們在自己的服務器上。

1

您可以將內存添加到服務器嗎?您可以購買少於1000美元的32 GB內存。