文章轉載原地址:http://www.companysz.com/mobydick/archive/2011/08/28/2155983.html
最近做的項目由于之前的設計人員懶省事,不按照范式來,將一張表的擴展信息存到了一個“鍵-值”表中。如下圖:
對于主表中的每一條信息,大約有60個“key”,也就是說主表中每插入1條記錄,子表中必須要插入60條。
通過預估我們確定主表中最終的數據量大約是20萬,也就是說,子表中會有20x60=1200萬條記錄。同樣類型的“主-子”表我們一共有4對,且不說這些表的查詢效率,單是每天一次的數據導入對于我們來說就是一項巨大的挑戰。
Technorati 標簽:SqlBulkCopy
在此我吐槽一下,本來一個十萬級的 數據庫,就是讓這種垃圾“設計師”生生給搞成了個千萬級的。而且最初他提出的數據插入方案是將每一條數據都生成一條Insert語句,然后逐條調用 ExecuteNoQuery執行,后果就是測試用的3000條主表記錄,共生成3000x60x4=72萬條數據,花費7小時執行完畢,性能30條/ 秒。后來他辭職了,換了個人,然后第二任也辭職了,第三任就是在下。
項目到我手里之后,在我的堅持下重新進行了軟件結構設計,由于數據庫系統已經被另一個子系統使用,所以沒辦法更改了,只好去尋找一種高效的插入方式。
最開始我使用多線程,開10個線程,使性能提升到300條/秒,測試用記錄花費大約40分鐘插入完畢,對于多60倍的正式數據來說,40小時執行完畢顯然不能滿足我們每天一次數據導入工作的要求。
通過Google大神,我找到了SqlBulkCopy。
經過測試,性能我很滿意,4000條/秒,那就先用它吧,下一階段的工作重點就是干掉“鍵-值”表。
在使用中,我也碰到了一些“莫名其妙”的問題,在此記下,以備查詢。
新聞熱點
疑難解答