1.轉http://zhidao.baidu.com/question/328967258.html
建分區表的話, 要看你有幾個磁盤.
如果只有一個磁盤的, 分區來分區去, 最后數據還是在 一個磁盤上面,
如果你有多個磁盤的.
那么可以根據那個 自增 ID , 設置一個 計算列
比如你有5個 磁盤, 那么 那個計算列 是 自增 ID % 5
那么 當 計算列的數值 = 1 , 數據被存儲到 磁盤1上面
那么 當 計算列的數值 = 2 , 數據被存儲到 磁盤2上面
那么 當 計算列的數值 = 3 , 數據被存儲到 磁盤3上面
那么 當 計算列的數值 = 4 , 數據被存儲到 磁盤4上面
那么 當 計算列的數值 = 0 , 數據被存儲到 磁盤5上面
這種情況,是針對 你插入數據量很大, 瓶頸發生在 磁盤 IO 處理的情況下。
可以提升一定的 插入的性能。
但是看你的那個描述
當記錄數據到達1000w之後插入記錄就變得很慢
那么我懷疑,可能是 索引處理 花費的時間比較多了
因為你插入一行數據
要更新 表的數據, 同時還有 更新索引的數據
表的數據,更新起來很簡單。 索引的更新,需要做一定的計算。
即時你的表,沒有任何的索引,但是那個 自增主鍵, 也是自動要創建索引的。
2.全表掃描,無法利用表上的索引。
3.先看磁盤io情況,然后再檢查下碎片情況,再看看無用的索引刪刪掉,insert的效率就會上來了。
4.轉:http://hi.baidu.com/szarticle/item/99a41f443ad81931fb896041搞定大量數據插入SQL SERVER,測試最快可達1萬(日志設為簡單)
終於搞定了中繼的數據采集,本以為一天搞定的事情,足足讓我搞了3天有余,部分時間是被其他事情耽擱了,主要原因是以前使用的插入數據庫數據的方式有問題。
之前,按照一個大哥的說法,使用存儲過程操作數據表,可能會防止數據表死鎖的問題,所以,所有的數據操作全部封裝為存儲過程來進行處理,包括:數據對象的insert操作,小數量數據的時候,也沒有多大感覺,但是現在插入的中繼信息居然達到了300萬的數量,按照原來的方法,每秒大概只能插入200數據,總用時15000秒,我靠,半天時間玩完了,多線程插入也沒用,速度差不對。
無解,只能想辦法提高采集速度,先把程序處理邏輯進行調整,還是沒有多大提高,畢竟數據插入太慢了,只得想辦法提高數據插入的操作,經過了解發現原因是,每次存儲過程會自動完成一個事務操作,而每個事物要進行日志的寫入,估計還有效驗等工作,簡單的做法就是將多個插入SQL語句組合在一個數據中,減少對日志的操作,發現效率提高的不錯,基本能達到1800條每秒。
具體做法:
1.如果不是必須,把數據庫的恢復模式改為“簡單”
2.使用如下的方式插入數據:最好直接作為一條SQL語句直接執行,但是不要寫太多條進去,貌似有人說大於1000了,應該有慢下來的,我每次插入20性能已經相當不錯,所以就先這樣把任務完成先,以后再研究最好的方法。
BEGIN TRANSACTION
INSERT …
INSERT …
INSERT …
COMMIT TRANSACTION
具體實現方法比較:
- 將一次要提交的SQL語句,無論多少條Insert全部組合成為一條SQL語句,以BEGIN TRAN;開始,以COMMIT TRAN;結束。這樣的操作速度最快可達1萬/秒。
- 跟上面方法一致,但是每條SQL語句執行一次ExecSQL,第一次ExecSQL(‘BEGIN TRAN’),最后ExecSQL(‘Commit TRAN’),這樣操作數據一般,性能提高微弱,目前我測試效率為1500條/秒左右。