讀取大量SQL Server資料, 速度很慢 |
尚未結案
|
kevin39
一般會員 ![]() ![]() 發表:7 回覆:7 積分:2 註冊:2002-07-09 發送簡訊給我 |
各位好,我目前遇到一個問題,請大家幫忙解答.....
環境:
SQL Server 2000 (某一個Table的資料量為209萬筆)
Delphi 6.0
Windows 2000 Server 我要從第一筆逐筆讀出來,並寫入text file,程式很單純,
1.用ADOQuery連SQL Server
2.開txt檔
3.用while迴圈去寫檔 我將我統計的時間記錄如下:
1.ADOQuery->CursorLocation = clUseServer
此方式ADOQuery Open的時間較快,約10秒,掃完資料約3小時
2.ADOQuery->CursorLocation = clUseClient.....約3hr
此方式ADOQuery Open的時間很久,約3分鐘,掃完資料約3小時
3.之後我又找了一些資訊,修改了ADOQuery->CacheSize = 1000 (default=1)
掃完資料約1小時多
4.最後我將程式內寫檔的部份去除,時間還是和上述一樣,相去不遠 以上是我所測試的時間.....我告訴各位,我不能接受!! 為什麼? 因為我用SQL Query Analyzer去SELECT只要花不到10分鐘,
資料就可以全部download下來 而且更令我生氣的是,我另一位同事用VB 6.0寫,
用ADO,一樣是用connection,一樣是用RecordSet,
為什麼VB的程式只花20幾分鐘,就可以掃完209萬筆資料,並且輸出至txt file ! 我想可能是我不太會用ADO的關係,
請各位如果有更好的想法或做法,可以告訴我 謝謝!!
|
領航天使
站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
引言: 為什麼VB的程式只花20幾分鐘,就可以掃完209萬筆資料,並且輸出至txt file ! 我想可能是我不太會用ADO的關係, 請各位如果有更好的想法或做法,可以告訴我我又來啦,對您發問的主題我特別有興趣! 我同意您說的:ADO不熟的關係, 同樣都是MS的產品當然可以連接的比較好! Delphi用ADO去連,可能會有很多相同性的考量所以將速度降下來, 您再試試用ADODataSet不要用TAdoQuery或TAdoTable看會不會比較快? ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~ |
ddy
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
一個Table 209萬筆,慢是可以理解的
除了天使所講的以外
應該想其它的方法
什麼狀況會要一次轉209萬筆資料??
如果資料不斷的增加…勢必會愈來愈慢 對於會不斷成長的資料庫,我們要維持其效能
就是要適當的結轉資料與分割資料庫
分割可以用日期(年/季/月)
結轉-->對於過期資料可以統計儲存 另如果要轉出文字檔
我的做法是…在資料進來時,先以temp table 儲存處理
所有的動作都完成後,將temp table 資料寫入主要的table
清掉temp table,主table 為最近一年或半年的資料
一年後的資料轉至歷史資料庫 這樣子…基本的效能才會高 參考看看
|
Mickey
版主 ![]() ![]() ![]() ![]() ![]() 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
Chance36
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
|
azurecloud
中階會員 ![]() ![]() ![]() 發表:52 回覆:108 積分:92 註冊:2003-09-04 發送簡訊給我 |
嗨,kevin39 您好:
之前我做一個 case 也是要處理大量的資料,我的經驗是
用 ADO Command 元件直接將 SQL 指令傳給 SQL Server 處理完後,
再一次將資料抓進程式裡會比較快,ADO Query 確實比較慢,我也不
知道為什麼。既然您說用 SQL Query Analyzer去SELECT只要花不到10分鐘
那就可以這樣試試:
//之前有建過同名稱的 temptable 時先 drop 掉
commandStr := 'if exists (select name from sysobjects where name=''temptable_name'') drop table temptable_name ';// ADO Command 的SQL 指令可一長串一次執行完畢,所以記得每句最後面空一格
//第二行寫您在 SQL Query Analyzer 中下的SELECT 指令,但改成 Select into 把結果另存入 temptable 裡
commandStr := commandStr 十 'Select * into temptable_name from ' 十 TheSourceTable 十 ' ';
//我是手動設定 ADO 的連接字串,程式較有彈性
connstr := ' Provider=SQLOLEDB.1;Password='十 SQLPassWord 十';Persist Security Info=True;User ID='十 SQLUserName 十';Initial Catalog='十 TheSourceDB 十';Data Source='十 TheSQLIP; Adocommand1.ConnectionString := connstr;
Adocommand1.CommandText := commandStr ;
adocommand1.Execute;
// 所以理論上執行完這一段和在 SQL Query Analyzer 中執行的時間是差不多的 資料量大時記得 CommandTimeout 屬性要設大一點,我設 3000 還沒逾時過。
最後再一次把資料讀出來,寫入 Text file 裡,這樣應該會比原來的快才對。
個人經驗,給您參考。 ===========
努力修行中...
===========
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |