2015-06-03 48 views
0

我對數據庫相當陌生,並且一直困擾着這個問題。我想我只需要指導如何開始解決這類問題。在oracle中導致高延遲導致多次寫入同一張表

我有一個web服務器設置爲非常頻繁地接收數據並將其寫入oracle數據庫。

服務器需要能夠接收每個用戶多行數據(每10秒約30-100個,偶爾有1000個行的卡塊,當有積壓時)。

從測試應用程序,它看起來像試圖擴大用戶數量時有一個瓶頸。我懷疑我只是採取了錯誤的方式與我如何編寫查詢/表結構。

使用100-150個用戶進行測試會使我的響應時間呈線性增長(20分鐘後可達800秒!)。

我的印象是每個有數據塊的請求都要排隊,每個oracle進程每個都寫一個,對嗎?這是由於表被鎖定?

數據全部寫入到一個表中,並且每個'行'正在輸入一個查詢。所以如果我有30行數據它需要運行30個插入。

嘗試提高性能時最好嘗試什麼?

  • 會有多個表格有幫助嗎?
  • 有沒有辦法一次寫多行,這可能有助於?

可能是一個長鏡頭,但希望有人能幫助/碰到過類似的問題。

謝謝。

+4

「*它需要運行30個插入*」 - 我希望你做在一個事務中的30個插件(例如,通過禁用自動提交,只提交*一次* 30個插入後) –

+0

你的Oracle版本是什麼? –

+0

你的web框架也是什麼。 –

回答

1

爲了提高效率/安全性,我建議你使用綁定變量(如果你不已經使用它們)的

INSERT INTO MYTABLE (col1, col2) VALUES ('value1', 'value2'); 

INSERT INTO MYTABLE (col1, col2) VALUES (:toto, :tata); 

,而不是這個作品,以及供選用:

SELECT col1 
FROM MYTABLE WHERE ID=:MYID 

更多信息在本文檔: http://docs.oracle.com/cd/B10501_01/appdev.920/a96584/oci05bnd.htm

其次,如果你打算在一次插入多行,這將是更有效地做批量插入:來回的服務器和客戶端之間的越少,越好:

對於爲例,如果你有一個數組:

FORALL i IN 1..MyArray.COUNT 
    INSERT INTO col1 VALUES MyArray(i); 

另外,我不認爲多個表將有助於(很難沒有更多的信息說),但通常,Oracle可以妥善處理,而不需要額外的表。

希望這有助於

+0

感謝您的建議,它絕對有幫助。 –