2011年7月12日 星期二

SQL 大量insert into 效能改善

最近一直在跟SQL打仗,總想著有沒有更快的方法。

實驗對象: 共有67萬筆左右的原始資料要做清整,之後再INSERT到結果表中。

若一筆一筆CONNECTION OPEN() , CLOSE(), RUN個70萬次,一定是最慢的。

所以,就設定一次抓1000筆先把SQL組好再做INSERT。
原先的組法是
INSERT INTO A (a1,a2,a3) values ('x1','x2','x3');
INSERT INTO A (a1,a2,a3) values ('x1','x2','x3')
 這樣的速度大概15分鐘run30萬筆左右。

後來發現sql 2008有新的用法,還有人寫ppt說速度會提升,寫法如下:

 INSERT INTO A (a1,a2,a3) values
('x1','x2','x3'),('x1','x2','x3');

很快速的來做實驗,結果,結果,15分鐘只run了9萬筆資料。噗。害我有點無言。

後來,又突然想到,好像忘了去原始資料表中,加一下index。
速度上就加快了些,約15分鐘36萬筆資料。
大概是極限了。
不知還有沒有更快的方法?


噗。就開始找了找,發現有人也跟我做類似的實際,他的結論是....

 INSERT INTO A (a1,a2,a3) values
('x1','x2','x3'),('x1','x2','x3');
這種寫法的速度跟一筆一筆insert差不多。

有種被騙的感覺。Orz


註:全部清整完,花了31分鐘~~(灑花)

結論:要記得取資料時,若有條件時,要記得做index的設定,大量insert into時,要先一批批組好。

沒有留言: