2012-01-05 133 views
0

在這裏,我面臨一個更具挑戰性的問題,並像往常一樣打開本網站獲得幫助。將多個插入到一個表中

我有一個Web服務執行一些業務邏輯,並最終將結果插入到表中。這工作正常,如果我的應用程序是在最小的負載。

現在,當負載很重時,我的INSERT SQL語句已超時。我增加了連接超時和命令超時。但問題是調用相同Web方法的線程太多。只是爲了提供一些提示,我在重負載下的OPEN sql連接數量達到了500+。僅供參考,每次執行命令後我都會關閉連接。

現在我應該在這裏做什麼來優化這個東西?

我打算將INSERT數據存儲在數據表中,並將此數據表存儲在APPLICATION變量中。每兩分鐘後,將數據表中的數據插入數據庫。

你們有沒有其他的想法可以使我的生活更順暢?

謝謝

編輯

這裏有更多的細節,當我在Management Studio運行插入查詢

SQL Server分析和編譯時間: CPU時間= 0毫秒,經過的時間= 0毫秒。

SQL Server分析和編譯時間: CPU時間= 0毫秒,經過時間= 11毫秒。

表'IndexTable1'。掃描計數0,邏輯讀取2,物理讀取0,預讀讀取0,lob邏輯讀取0,lob物理讀取0,lob預讀取讀取0.

表'IndexTable2'。掃描計數0,邏輯讀取2,物理讀取0,預讀讀取0,lob邏輯讀取0,lob物理讀取0,lob預讀取讀取0.

表'fulltext_index_docidstatus_171147655'。掃描計數0,邏輯讀取11,物理讀取0,預讀讀取0,lob邏輯讀取0,lob物理讀取0,lob預讀取讀取0.

表'MAINTABLE'。掃描計數0,邏輯讀取28,物理讀取4,預讀0,lob邏輯讀取0,lob物理讀取0次,lob預讀0

(受影響1行(S))

(1 row(s)affected)

SQL Server執行時間: CPU時間= 0毫秒,經過時間= 69毫秒。

SQL Server分析和編譯時間: CPU時間= 0毫秒,經過時間= 0毫秒。

SQL Server執行時間: CPU時間= 0毫秒,經過時間= 0毫秒。

+0

連接池有多大? – Jordan 2012-01-05 06:20:28

+0

您完全需要對您的應用程序進行基準測試,以確定潛在的瓶頸。對於初學者來說,熟悉SQL Server的「解釋計劃」,檢查你的索引,並查看負載下的Windows性能監視器,以檢查CPU,RAM和磁盤I/O利用率。請看這些鏈接:1)http://msdn.microsoft.com/en-us/library/ff647768.aspx 2)http://msdn.microsoft.com/en-us/library/ms178071.aspx – paulsm4 2012-01-05 06:23:36

+0

您是否查看過生產者/消費者模式以處理來自共享上下文的插入,這樣您就可以控制連接數並使用SqlBulkCopy。 – Lloyd 2012-01-05 06:24:49

回答

2

您可以使用專用線程將數據插入數據庫。爲每個插入語句打開一個新連接沒有意義,相反,您可以每隔幾秒插入一次大塊數據。該線程可以運行在專用的調度程序或計時器上,並且可以使用線程安全隊列進行線程間通信。

1

您是否想過要獲得合適的服務器?很抱歉地說,但是完全忽略硬件實現的方式讓我認爲你的數據庫服務器是一個「典型的低端主機」,它本質上不適合運行大多數IO綁定的沉重SQL負載,因此需要高端IO子系統。

+0

我有專用服務器,帶有高CPU的4GM RAM(不記得它的細節),只有這個應用程序正在運行服務器 – user867198 2012-01-05 06:46:30

+0

所以,一個玩具(4GB內存是低端機 - 平均桌面內存),可能是一個小桌面級的光盤?你想知道IO超負荷嗎?構建數據庫服務器的入門指南可能是合適的。如果光盤過載,CPU和數據庫大多無關,而普通光盤的速度很慢 - 每秒150到200次操作。 – TomTom 2012-01-05 06:48:21

0

我不知道這個問題的簡單答案。首先,你的計劃會進入併發問題,你可能會試圖鎖定你的數據表等,這可能會造成麻煩。作爲一個經驗法則,我建議不要在應用程序和數據庫服務器之間建立連接。但另一方面,你的開放連接數是500+是不應該發生的。我認爲這是你應該關注的問題。我想你的交易是一個很大的交易,並且它運行了幾秒鐘。儘量減少它。我可以提供將數據寫入一個非常簡單的未處理數據庫表,如編寫日誌。在定期運行的SQL作業中,從該表中讀取並行處理它們。你甚至可以管理一個系統,當它檢測到負載時,它會延遲處理。

如果在一個給定的點上有多個類似的插入查詢,那麼無論我上面的語句如何,都必須考慮System.Data.SqlClient.SqlBulkCopy類。

祝你好運。

+0

我在SQL SP中只有一個Insert語句。我會在SqlBulkCopy命令上給它一個鏡頭。看起來不錯的替代方案 – user867198 2012-01-05 06:50:44

0

回答這樣的疑問,可能會過於複雜

揣摩瓶頸在哪裏 - 是@客戶或@服務器端。

什麼涉及到INSERT指標的量,如果有任何熱點你的表的頂部 - 有沒有同時選擇所執行這對於單分區自動增量主鍵的表

很平常超過表當插入它時

你應該檢查所有這些和許多其他原因,以找出問題出在哪裏。

試着在你的問題提供更多有價值的信息

+0

在前端方面同時執行了SELECT語句,但是我所有的SELECT都帶有NOLOCK選項。所以我認爲它不應該產生任何問題 – user867198 2012-01-05 06:55:41

0

伊利亞·高根的答案似乎是合理的,它是在同樣的你的。基本上按照計劃進行批量插入。請記住,只有在您插入的信息本身不用於業務邏輯來響應新請求時,這纔會起作用。 當你發出一個響應時,客戶端會認爲無論服務器狀態發生了什麼變化,當它決定發出第二個請求時,就會出現兩個問題:1)如果響應客戶端出於任何原因稍後不能插入該請求的結果? 2)如果收到響應後客戶會發出一個新的請求,那麼第一個請求的結果仍然不會持續下去會發生什麼?應用程序將使用什麼數據來處理第二個請求。 正如你所看到的,這個看起來很簡單的解決方案可能會導致其他問題,但這一切都取決於你的web服務是如何設計的,特別是如果需要爲每個請求保存任何持久數據來處理進一步的請求。

相關問題