2016-04-20 228 views
0

我正在構建一個複雜的應用程序。來自該應用程序的部分是在其他服務器上運行並將數據發送到Web服務(ASP MVC) - > JSON的代理。 在控制器中,我將數據轉換爲XML並調用存儲過程將其存儲在表中。 SQL代理作業提取數據並執行必要的創建,並根據某些表更新&刪除操作。插入大BLOB需要很長時間

迄今爲止這麼好...

這裏的問題是速度。生成的XML具有多個MB的大小。目前其〜16MB。將XML字符串插入新的DB行需要5-6秒。

我的嘗試:

  • 改變了DB列XML。同樣的結果!
  • 我認爲問題是實體框架。我用存儲過程替換了該代碼。同樣的結果!
  • 刪除SP - >空存儲過程中的所有語句。同樣的結果!
  • 將參數類型從字符串/ nvarchar(max)更改爲byte []/varbinary(max)。這帶來了一些改進。它現在快了50%。但仍然緩慢。

似乎將這個大字符串或字節數組傳遞給SQL服務器需要很長時間!

我該怎麼做才能讓這個更快?

我想到了以下內容: - 將數據放在文件系統上並指示SQL服務器使用SELECT FROM OPENROWSET處理它。

有沒有其他的選擇?

+0

該表的定義是什麼?您是以文本形式存儲還是使用SQL Server的XML支持來解析它? – Richard

+0

您可以將數據存儲在磁盤上並在數據庫中包含文件指針/路徑。在大多數情況下,這是一個更好的方法。它使您的數據庫更小,碎片更少,性能更好,更易於持久更改數據。我確信有一些關於從數據庫中保留(更大)blob的優點的文章。 – Igor

+0

這可能是你感興趣的:[程序員Stackexchange - 在數據庫中存儲大文件是否是一種不好的做法?](http://programmers.stackexchange.com/a/150787),特別是關於'FILESTREAM 「如果你想進步。 – Igor

回答

0

嘗試異步運行您的SQL操作。我希望你不需要立即的結果。

Threading.ThreadPool.QueueUserWorkItem(new Threading.WaitCallback(InsertBLOB), MyBLOB); 

此方法的缺點是您不會在運行時收到錯誤。