2011-11-17 17 views
2

我正在維護一個擁有數百萬用戶的彩票網站。一些活躍的用戶(可能超過30,000)將在1秒內購買1000多個彩票。 現在當前邏輯使用select ....進行更新以確保帳戶餘額,但同時數據庫服務器已超載並且處理速度很慢?我們必須實時處理它們。如何解決Oracle中大量的併發寫操作?

有任何人以前見過類似的情景嗎?

+1

如果你想解決你的問題,你可以量化過載,你需要調查瓶頸的位置,磁盤/閂鎖爭用/ CPU等。 –

+0

我想你應該更簡單地解釋一下。 – 2011-11-17 07:59:34

回答

5

首先,你需要設計滿足您的業務規則事務處理系統。目前,忘記磁盤和內存,以及在哪裏。儘量設計一個儘可能輕量級的系統,它能夠滿足您的業務規則,並達到所需的最低鎖定量。

現在,運行系統,會發生什麼?如果表現可以接受,恭喜,你完成了。

如果性能不可接受,避免的誘惑猜測問題,並開始進行調整。你需要分析系統。您需要了解大部分時間花費的位置,以便了解調整工作的重點。最簡單的方法是使用SQL_TRACE來追蹤它。您沒有提及任何Oracle版本,版本或平臺。所以,我會假設你至少在某些版本的10gR2上。因此,使用DBMS_MONITOR開始/結束跟蹤。現在,範圍在這裏很重要。我的意思是,開始跟蹤,運行想要分析的代碼然後立即關閉跟蹤非常重要。這樣,您只追蹤您感興趣的內容,並且該配置文件不會包含任何無關信息。一旦你有了跟蹤文件,你需要處理它。有幾個工具。最常見的是由Oracle提供的TkProf,但實際上做得不好。我知道的最好的免費探查器是OraSRP。下載OraSRP的副本,並檢查結果。報告中的數據應該指向正確的方向。

完成所有這些後,如果仍有問題,請在此提出一個新問題,我相信我們可以幫助您解釋OraSRP的輸出,以幫助您瞭解瓶頸的位置。

希望有所幫助。

+0

非常感謝,我會嘗試這種方式。 – superleo

2

就個人而言,我會鎖定/更新內存的賬戶和更新數據庫作爲後臺任務。使用這種方法,您可以輕鬆支持數千個更新和帳戶。

+0

感謝您的回覆。但數據非常重要,您知道表中包含用戶帳戶與金錢。所以用戶想要實時查看他們的賬戶。 – superleo

+0

如果帳戶在內存中,您的支票將實時。主要問題是確保信息在失敗時不會丟失。大多數真實磁盤僅支持每秒100 IOPS。您必須在某個級別緩存數據才能支持此更新速率。使用固態硬盤可能是您所需要的,因爲它可以支持每秒更多的IOPS。 –

2

A.加快東西而不需要修改代碼:

1 - 你可以保持桌面完全在內存(也就是SGA - 因爲它也是在磁盤上):

alter table t storage (buffer_pool keep) 

(與你的dba討論之前做到這一點)

2 - 如果表太大,你一次又一次地更新相同的行,可能是足夠使用緩存屬性:

alter table t cache 

這個命令在LRU列表中以最佳優先級使用表格時會放入表格的塊,所以從SGA中老化的機會就會減少。 這裏是一個關於差異discusion:ask tom

3 - 另一種解決方案,先進的,需要更多的分析和資源的TimesTen

B.Speed你的數據庫操作:

識別頂部querys和:

  • 創建索引,在其中更新或僅選擇一行或一小組行。
  • 分區大表掃描僅數據段。

你有沒有確定一個頂部查詢?

+0

感謝兄弟, 1.我想確定在內存分貝中是否能確保業務交易數據的可靠性和一致性? 2.如何將數據從內存數據庫同步到磁盤數據庫?我應該用當前的邏輯做一些改變嗎? – superleo

+0

將表格全部保存在SGA中不需要在代碼中完成任何事情,就像sincronyze,refresh和其他東西一樣。對於程序員來說,它絕對透明。 Oracle將確保所有數據在磁盤上安全。記住這一點:當你查詢DML時,Oracle會修改內存中的數據(SGA),並且其他Oracle進程將數據寫入磁盤。在我們的案例中,從這個角度來看,沒有什麼不同。 –

+0

您只需要與您討論DBA,以確保它在SGA中有足夠的空間,以及任何其他dba相關的東西。 –