將資料大量寫入資料庫時的優化寫法
- 2008-05-18
- 24675
- 0
當初學者需要利用for迴圈寫入資料時,常常會犯一個錯誤,就是SqlConnection開開關關,迴圈跑100次它就活生生開關一百次,雖然資料量小時看不出影響但這是相當浪費效能與資源的寫法,只要改變寫作習慣就可以避免掉這問題,來看看吧。
?小鋪廢言:demo以GridView1秀出資料後再把它全部寫入到一個名為Table1的資料表。
▲以下是一般初學者會寫的code
for (int i = 0; i < this.GridView1.Rows.Count; i++) { SqlConnection conn = demotools.getSqlConnection();//此為demo取得SqlConnection的方法 SqlCommand comm = new SqlCommand("INSERT INTO [Table1] ([name]) VALUES (@name)", conn); conn.Open(); comm.Parameters.AddWithValue("name", this.GridView1.Rows[i].Cells[1].Text); comm.ExecuteNonQuery(); conn.Dispose(); comm.Dispose(); }
▲沒錯這樣寫是可以正常的寫入資料庫,但是因為開關連結的方式包含在for迴圈內所以就會發生前文所說得問題,瘋狂的開關,為了節省效能我們應該這樣寫
SqlConnection conn = demotools.getSqlConnection(); SqlCommand comm = new SqlCommand("INSERT INTO [Table1] ([name]) VALUES (@name)", conn); //以上都應該放在for迴圈外(除非你會變動=.=) int i; //宣告變數也應該放在外面不應該在for內 conn.Open();//開啟連結拿出來了 for (i = 0; i < this.GridView1.Rows.Count; i++) { comm.Parameters.Clear();//清除掉目前宣告出來的Parameters comm.Parameters.AddWithValue("name", this.GridView1.Rows[i].Cells[1].Text); comm.ExecuteNonQuery(); } conn.Dispose(); comm.Dispose();
- 測試環境:SQL2005 Express
- 測試資料量:10萬筆
- 測試次數:10次
- 平均秒數:64.4867秒
?小鋪廢言: 這樣子的寫法是demo目前會的最好的寫法,當然我還很嫩其他的大大一定有更好的寫法還請多指教...當然其中還可以加上交易等判斷但那些不是此篇的重點所以demo以最簡單的方式寫出來,希望此篇對您會有所幫助,或許你懷疑SQL怎麼會那麼慢,請注意測試環境使用的是Express版本,並且10萬筆這種大筆數本來就不太應該用這方法寫...
回應討論