全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4498
推到 Plurk!
推到 Facebook!

讀取大量SQL Server資料, 速度很慢

尚未結案
kevin39
一般會員


發表:7
回覆:7
積分:2
註冊:2002-07-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-12 20:04:17 IP:203.73.xxx.xxx 未訂閱
各位好,我目前遇到一個問題,請大家幫忙解答..... 環境: 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-12 21:31:20 IP:210.202.xxx.xxx 未訂閱
引言: 為什麼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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-19 00:57:19 IP:61.59.xxx.xxx 未訂閱
一個Table 209萬筆,慢是可以理解的 除了天使所講的以外 應該想其它的方法 什麼狀況會要一次轉209萬筆資料?? 如果資料不斷的增加…勢必會愈來愈慢    對於會不斷成長的資料庫,我們要維持其效能 就是要適當的結轉資料與分割資料庫 分割可以用日期(年/季/月) 結轉-->對於過期資料可以統計儲存    另如果要轉出文字檔 我的做法是…在資料進來時,先以temp table 儲存處理 所有的動作都完成後,將temp table 資料寫入主要的table 清掉temp table,主table 為最近一年或半年的資料 一年後的資料轉至歷史資料庫    這樣子…基本的效能才會高    參考看看    
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-19 11:44:21 IP:218.32.xxx.xxx 未訂閱
不知對 BDE 有沒有興趣. 1. 用 Table1 Open MSSQL. 2. 用 Table2 Open Text File.(須先定一個副檔名 ".SCH" 的 File, BDE Text Driver 詳細 Help 說明可於 Delphi "Help->Delphi Tools"找到). 3. 用 BatchMove.Source := Table1, BatchMove.Destination := Table2. 速度不知如何 ?
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-03 13:49:45 IP:203.204.xxx.xxx 未訂閱
kevin39 你好 最近剛看到這篇轉貼文件,使用AdoQuery.RecordSet.MoveNext;方法參考看看! http://delphi.ktop.com.tw/topic.php?topic_id=52512
azurecloud
中階會員


發表:52
回覆:108
積分:92
註冊:2003-09-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-07-03 17:49:10 IP:163.13.xxx.xxx 未訂閱
嗨,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 裡,這樣應該會比原來的快才對。 個人經驗,給您參考。    =========== 努力修行中... ===========
系統時間:2024-07-02 23:37:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!