2011-02-10 49 views
1

我從包含150K行的網頁上的用戶導入文件,並且必須將其分解,從而導致將要添加到數據庫的大約160萬個項目。如何將參數添加到批量插入語句以防止SQL注入並提高性能?

此刻我首先添加主要記錄,然後使用在第一個記錄之後提供的密鑰添加子項。

雖然我可以預編譯查詢並重新使用它,但我想將它們中的大部分組合在一起,但是我擔心在此時無法對查詢進行參數化。

目前我只能通過查詢方法導入大約300行或3000個查詢/秒。

+0

我知道大數據加載性能的唯一方法是使用http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx,但這不會有幫助對於第一步,插入父行以生成外鍵值。它可能有助於子行雖然 – 2011-02-10 04:54:22

+0

我確實有想過使用臨時表來處理這個問題。也許將行的索引添加到較大的集合中,並在需要將數據移動到實時表格中時使用真實ID進行更新。我認爲這會起作用,但它仍然不能解決更大的問題。 – Middletone 2011-02-10 05:02:29

回答

0

我不確定你的約束是如何加載數據,但有幾個好的途徑可以將良好的批量導入速率導入數據庫 - >Performing Bulk Copy Operations。當與數據導入過程的工作,我總是發現它有助於把它分解成幾個階段:

  1. 導入階段 - 可根據您的情況不同的各種散裝方法
  2. 分期階段 - 處理工作;例如數據驗證,建立關鍵關係,數據清理等。
  3. 最終插入「實時」表。 (希望設置基於插入)

它可以是非常有效的拾取所有在第一遍的數據了很少或幾乎沒有邏輯的工作,並將其移動到一個臨時區域的連接質量;爲此目的進入臨時表或永久臨時表。然後,您可以對數據執行任何處理工作,以便將所有內容正確地結構化並清理乾淨,然後再將其插入到實時表格的最終家中。這也可以通過執行一個或多箇中間步驟爲您提供絕對免於任何惡意數據或SQL注入攻擊的層。

這種分離方式允許批量導入任務的速度儘可能快,因爲希望很少有邏輯需要將批量導入大型分段堆場。然後,您可以應用所需的任何邏輯來切片數據,但它是合適的。此外,如果在分期階段需要完成幾個步驟,則可以將其分解爲多個較小的步驟,並着重優化最大/最慢的部分。

在你的情況下,如果你有一種方法可以在進入暫存階段以匹配活動表格中的內容之後構建數據,那麼你可以將它作爲一個大集合插入。在最終插入之前(以及處理任何其他數據處理工作),能夠在分段階段中構建PK-> ForeignKey關係,可以允許您從迭代插入到一個大的批量集插入.. set based is usually a very good thing。也就是說,當然,如果你的系統/限制允許你這樣做。

我不確定是否有任何適用於您的情況,如果我的方式是基於你所要求的;但希望有一些可以用到的東西。