2015-05-05 44 views
0

對於SQL Server 2008+中的大型表上的批量更新,我將不勝感激。SQL和VB.net winform的批量更新概念

目前我有一張有10,000行160列的表格。該表經常更新,每行取決於過程1到100列更改。使用'標準新手'表更新使用DataAdapter是非常緩慢和不適合的。

追求的是尋找更快的方法。我試圖用批量大小微調DataAdapter.Update,無論更重的更新需要10-15秒。同時SqlBulkCopy在(球場)1-3秒內輸入整個表格。當更新過程在一個過程中發生30-50次時,10s-15s加起來!

作爲互聯網的自我思考,我的經驗存在差距,但是我認爲有兩種可能性可以在完成更新任務時更好。

  1. 從數據庫轉儲表內容並使用SqlBulkcopy重新填充表。

  2. 將存儲過程與通過合併SQL語句傳遞給它的表一起使用。

主要問題是數據安全性,雖然這是一個本地單用戶應用程序,但需要有一種方法來處理錯誤回滾。根據我的理解,轉儲和替換會更簡單,但可能更容易出現數據丟失?存儲過程的設置要廣泛得多,因爲更新語句必須單獨輸入所有更新列並保留更改。除非有一個'更新*'聲明:)。

爲了保持這個簡短,我希望只保留這個概念級別,但會欣賞任何不同的想法或鏈接和建議。

編輯更多信息: 該表只有一個索引,ID列。它是將傳入(和更改)數據存儲到簡單數據表的簡單過程。並且更新可以是1行到1000行之間的任何地方。程序經常將信息存儲到數據庫,並且可以是一些或幾乎所有的列。爲每次更新構建存儲過程將是不可能的,因爲我不知道哪些數據將被更新,可以說所有列都將被更新(除了ID列和一些「硬」數據列),它取決於更新輸入是什麼。因此,除非我每次都列出幾乎所有的更新,否則沒有很好的調整對特定列的更新。在這種情況下,一個存儲過程就可以做到。

我認爲問題是使用當前數據適配器方法對數據庫進行「調用」的次數。

編輯: 3大約一個臨時表在哪裏我批量複製數據,然後有一個存儲過程做更新。這不會削減SQL流量嗎?我認爲這是dataadapter更新的問題。

編輯:發表了一個概念1試圖在這個線程的答案。

謝謝

+0

您可以充實一點關於表的結構和更新嗎?桌子上有什麼索引(尤其是聚簇索引)?這些更新究竟發生的頻率如何?爲什麼? – mellamokb

回答

0

刪除表,並用批量複製重新加載整個事情是不正確的方法。

我建議創建的每個更新表過程中的存儲過程。該程序應作爲輸入僅需要針對特定​​的工藝進行更新,然後運行一個標準的SQL update命令對指定的行更新這些列的列。如果可能,請嘗試在用於查找需要更新的記錄的列上使用索引。

或者,取決於哪個版本您正在使用的.NET Framework,您可以嘗試使用實體框架,如果你不想保持的存儲過程的整個列表。

+0

用於查找行中的列索引。不幸的是,更新可能包含1到120列的更新,因此我將在每個更新命令中將它們命名爲幾乎全部。 – user1500403

0

我已經編寫了以下樣機從表中轉儲全部行,bulkcopy在內存中的表到一個SQL臨時表中,然後將數據移回原來的表。所以通過更新該表中的數據。相比它需要更新10-15s

所用時間1.1〜1.3秒

肯定是一個非常有吸引力的時間。我已將登臺表的truncete代碼放在頂部,以便數據庫中始終有一個信息副本。雖然原始表格將不會有更新的信息,直到完成該過程。

什麼pitfals副本的形式給出?我能對他們做些什麼?我必須指出,表格不可能超過10000行,所以這個過程將起作用。

Try 

      ESTP = "Start Bulk DBselection Update" 

      Dim oMainQueryT = "Truncate Table DBSelectionsSTAGE" 
      Using con As New SqlClient.SqlConnection(RacingConStr) 
       Using cmd As New SqlClient.SqlCommand(oMainQueryT, con) 
        con.Open() 
        cmd.ExecuteNonQuery() 
        con.Close() 
       End Using 
      End Using 

      ESTP = "Step 1 Bulk DBselection Update" 

      Using bulkCopy As SqlBulkCopy = New SqlBulkCopy(RacingConStr) 
       bulkCopy.DestinationTableName = "DBSelectionsSTAGE" 
       bulkCopy.WriteToServer(DBSelectionsDS.Tables("DBSelectionsDetails")) 
       bulkCopy.Close() 
      End Using 

      ESTP = "Step 2 Bulk DBselection Update" 

      oMainQueryT = "Truncate Table DBSelections" 
      Using con As New SqlClient.SqlConnection(RacingConStr) 
       Using cmd As New SqlClient.SqlCommand(oMainQueryT, con) 
        con.Open() 
        cmd.ExecuteNonQuery() 
        con.Close() 
       End Using 
      End Using 

      ESTP = "Step 3 Bulk DBselection Update" 

      oMainQueryT = "Insert INTO DBSelections Select * FROM DBSelectionsSTAGE" 
      Using con As New SqlClient.SqlConnection(RacingConStr) 
       Using cmd As New SqlClient.SqlCommand(oMainQueryT, con) 
        con.Open() 
        cmd.ExecuteNonQuery() 
        con.Close() 
       End Using 
      End Using 

      Data_Base.TextBox25.Text = "Deleting data - DONE " 
      Data_Base.TextBox25.Refresh() 

     Catch ex As Exception 

      ErrMess = "ERROR - occured at " & ESTP & " " & ex.ToString 
      Call WriteError() 
      Call ViewError() 

     End Try