[問題]資料庫存取效率問題

看板C_Sharp作者 (王建閔)時間16年前 (2009/06/19 15:41), 編輯推噓0(0022)
留言22則, 3人參與, 最新討論串1/2 (看更多)
======某個函數中的內容===================================================== 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)

06/19 15:51, , 1F
第一 當然mssql效率會比較好
06/19 15:51, 1F

06/19 15:52, , 2F
第二 有什麼需要 為什麼要把38萬筆都讀到前端程式來
06/19 15:52, 2F

06/19 15:52, , 3F
如果你有需要每筆都做更改 最好做個預存程序在mssql端
06/19 15:52, 3F

06/19 15:53, , 4F
速度會好上很多 因為都在資料庫裡完成 不用傳到前端在傳回去
06/19 15:53, 4F

06/19 15:53, , 5F
第一個問題 業主希望我能用Access,因為我寫的模組日後
06/19 15:53, 5F

06/19 15:53, , 6F
要移交到他們的資訊平台,而他們的平台竟然是用Access的
06/19 15:53, 6F

06/19 15:54, , 7F
第二個問題,我是從一個數據集(test.RAW)析離出數據
06/19 15:54, 7F

06/19 15:55, , 8F
再行存入,至於日後讀出的方法,尚未規畫
06/19 15:55, 8F

06/19 15:55, , 9F
就你貼的程式碼"select * from XXX" 已經沒有sql優化的空間
06/19 15:55, 9F

06/19 15:56, , 10F
要考慮的是有沒有需要一次讀寫那麼大筆的資料
06/19 15:56, 10F

06/19 15:58, , 11F
我尚未考慮資料集優化的方法(例如38萬列取1萬列)
06/19 15:58, 11F

06/19 15:58, , 12F
如果可以,還是希望能夠將38萬列全部如實匯入資料庫
06/19 15:58, 12F

06/19 15:59, , 13F
喔 我看錯你意思 所以主要時間是花在寫回上面喔
06/19 15:59, 13F

06/19 16:00, , 14F
寫入的時間主要是看你寫的table index複雜程度
06/19 16:00, 14F

06/19 16:00, , 15F
我是希望38萬列能如實建入,只優化資料讀出工作
06/19 16:00, 15F

06/19 16:02, , 16F
每一列只有兩個數值,為主鍵data_ID(int)和value(double)
06/19 16:02, 16F

06/19 16:03, , 17F
註:38萬列只是其中一筆資料集,而每次工作有3000筆
06/19 16:03, 17F

06/19 16:04, , 18F
我實在不想花3000*8分鐘去批次存入,看起來這樣要20天
06/19 16:04, 18F

06/19 16:05, , 19F
Access又有資料庫獨佔的問題,實在讓我很苦惱
06/19 16:05, 19F

06/19 16:06, , 20F
我剛才爬文,SQL有bcp外掛,不知Access有沒有類似的東西
06/19 16:06, 20F

06/19 16:11, , 21F
有沒有方法,能將整個陣列,一次帶入table的某一欄中?
06/19 16:11, 21F
※ 編輯: Eleganse 來自: 140.115.61.67 (06/19 16:34)

06/19 21:45, , 22F
把目的端Index拿掉匯入後再加入呢???
06/19 21:45, 22F
文章代碼(AID): #1AEq4QqO (C_Sharp)
文章代碼(AID): #1AEq4QqO (C_Sharp)