作者Eleganse (王建閔)
看板C_Sharp
標題[問題]資料庫存取效率問題
時間Fri Jun 19 15:41:13 2009
======某個函數中的內容=====================================================
ImcCoImcCoreLib.DFile thisFile = new ImcCoreLib.DFile();
thisFile.Open(".\\Samples\\test1.RAW",0);
Array a = ((Array)thisFile.DChannels[1].GetData(1,thisFile.DChannels[1].Length));
//第1行到第3行,開啟一個Array a,將test.RAW中第一欄所有數據讀入
這些數據,總共有38萬筆。
/////////////////////////////////////////////////////////////////////////////
string cs = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\\DataBase.mdb";
OleDbConnection conn = new OleDbConnection(cs);
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.SelectCommand = new OleDbCommand("select * from T_Data", conn);
OleDbCommandBuilder cb = new OleDbCommandBuilder(adapter);
DataSet ds = new DataSet();
adapter.Fill(ds);
/////////////////////////////////////////////////////////////////////////////
//第4行到第10行,與Access間連線程式,說明略。
for (int i = 1; i <= thisFile.DChannels[1].Length; i++)
{
ds.Tables[0].Rows.Add(i,a.GetValue(i));
}
//第11行到第14行,將Array a中38萬筆資料存入dataset中
adapter.Update(ds);
//第15行,更新回資料庫
==============================================================================
//以上程式碼,為某一個函數中的內容。
在第11行到第15行,總共花了近8分鐘執行完畢,
想請問版上各位大,有沒有迅速的方法,
可以節省與Access間一次讀取\存入數十萬筆資料列的時間?
又或者,只有MSSQL才有辦法?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.61.67
※ 編輯: Eleganse 來自: 140.115.61.67 (06/19 15:42)
※ 編輯: Eleganse 來自: 140.115.61.67 (06/19 15:49)
※ 編輯: Eleganse 來自: 140.115.61.67 (06/19 15:51)
→ MRjk:第一 當然mssql效率會比較好 06/19 15:51
→ MRjk:第二 有什麼需要 為什麼要把38萬筆都讀到前端程式來 06/19 15:52
→ MRjk:如果你有需要每筆都做更改 最好做個預存程序在mssql端 06/19 15:52
→ MRjk:速度會好上很多 因為都在資料庫裡完成 不用傳到前端在傳回去 06/19 15:53
→ Eleganse:第一個問題 業主希望我能用Access,因為我寫的模組日後 06/19 15:53
→ Eleganse:要移交到他們的資訊平台,而他們的平台竟然是用Access的 06/19 15:53
→ Eleganse:第二個問題,我是從一個數據集(test.RAW)析離出數據 06/19 15:54
→ Eleganse:再行存入,至於日後讀出的方法,尚未規畫 06/19 15:55
→ MRjk:就你貼的程式碼"select * from XXX" 已經沒有sql優化的空間 06/19 15:55
→ MRjk:要考慮的是有沒有需要一次讀寫那麼大筆的資料 06/19 15:56
→ Eleganse:我尚未考慮資料集優化的方法(例如38萬列取1萬列) 06/19 15:58
→ Eleganse:如果可以,還是希望能夠將38萬列全部如實匯入資料庫 06/19 15:58
→ MRjk:喔 我看錯你意思 所以主要時間是花在寫回上面喔 06/19 15:59
→ MRjk:寫入的時間主要是看你寫的table index複雜程度 06/19 16:00
→ Eleganse:我是希望38萬列能如實建入,只優化資料讀出工作 06/19 16:00
→ Eleganse:每一列只有兩個數值,為主鍵data_ID(int)和value(double) 06/19 16:02
→ Eleganse:註:38萬列只是其中一筆資料集,而每次工作有3000筆 06/19 16:03
→ Eleganse:我實在不想花3000*8分鐘去批次存入,看起來這樣要20天 06/19 16:04
→ Eleganse:Access又有資料庫獨佔的問題,實在讓我很苦惱 06/19 16:05
→ Eleganse:我剛才爬文,SQL有bcp外掛,不知Access有沒有類似的東西 06/19 16:06
→ Eleganse:有沒有方法,能將整個陣列,一次帶入table的某一欄中? 06/19 16:11
※ 編輯: Eleganse 來自: 140.115.61.67 (06/19 16:34)
→ Catbert:把目的端Index拿掉匯入後再加入呢??? 06/19 21:45