線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1207
推到 Plurk!
推到 Facebook!

請問要如何縮短寫入資料庫的時間呢?

尚未結案
jackwu
一般會員


發表:28
回覆:54
積分:16
註冊:2002-08-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-23 18:37:17 IP:211.75.xxx.xxx 未訂閱
我現在利用Table元件將資料寫入資料庫,當然是使用最基本的方法去將資料寫入到資料庫中 Table1->Open(); Table1->Edit(); Table1->First(); Table1->Insert(); Table1->FieldValues["User Name"] = LoginForm->username; Table1->FieldValues["Date"] = Now().DateString(); Table1->FieldValues["Time"] = Now().TimeString(); Table1->FieldValues["Event"] = WriteEvent; Table1->Post(); Table1->Close(); 可是當有大量的資料需要寫入時(呼叫此副程式),速度就會變的很慢,請問要如何才能加快寫入的速度呢?謝謝 <<我是猜測要打開資料庫時會需要一段時間,不知道是不是因為這樣才使得速度變慢的>>
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-23 21:01:27 IP:61.221.xxx.xxx 未訂閱
Hi, 將 open 和 close 作一次就好了, 而且 first 可以不用下, 如下:    
Table1->Open();
for(var i=0;i<20;i  )
{
  Table1->Edit();
  //Table1->First();
  Table1->Insert();
  Table1->FieldValues["User Name"] = LoginForm->username;
  Table1->FieldValues["Date"] = Now().DateString();
  Table1->FieldValues["Time"] = Now().TimeString();
  Table1->FieldValues["Event"] = WriteEvent;
  Table1->Post();
}
Table1->Close();
jackwu
一般會員


發表:28
回覆:54
積分:16
註冊:2002-08-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-23 22:20:59 IP:219.91.xxx.xxx 未訂閱
謝謝 其實我也有使用過這種方式,但是在程式某些地方我只需要寫入一筆資料,這樣也要將資料庫做一次開關的動作,發現也會佔用許多的時間。請問還有其他的方法嗎?謝謝 我的資料庫是在Server端,並不是在Local,而且會有30~40台的PC連上資料庫,但並不一定會同時去開啟資料庫。 順便在問一下,如果在同一個時間有2台以上的PC或者是有一台PC已經先開了資料庫並且再寫入資料,請問此時會發生什麼事呢?是否兩台PC的資料都可以寫入資料庫呢?謝謝
tech_state
版主


發表:44
回覆:638
積分:641
註冊:2003-02-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-24 00:04:47 IP:203.204.xxx.xxx 未訂閱
引言: 順便在問一下,如果在同一個時間有2台以上的PC或者是有一台PC已經先開了資料庫並且再寫入資料,請問此時會發生什麼事呢?是否兩台PC的資料都可以寫入資料庫呢?謝謝
jackwu, 您好 這就涉及到資料的鎖定問題了 我大略說一下 詳細的部分還是要請您自己看書找資料 資料鎖定分為 1.唯讀:只能做讀取的動作,其他皆不能 2.悲觀鎖定:使用者將資料進入修改狀態時,該筆資料便被鎖定,直到使用者cancel or post 3.樂觀鎖定:只有在使用者作post時,該筆資料才會被鎖定,一旦post的動作ok,資料就被釋放 以上資料皆指record 以上內容若有錯誤請指正 ============ 是非終日有 不聽自然無
jackwu
一般會員


發表:28
回覆:54
積分:16
註冊:2002-08-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-24 09:39:41 IP:211.75.xxx.xxx 未訂閱
謝謝站長的回覆 那對於現在資料庫的寫入速度我有一個想法,不知道可不可行,請各位給我一個意見好嗎?謝謝 現在我是希望將所有的資料先寫入到一個文字檔之類的文件,等待資料寫入完成之後,我再利用Thread寫入資料庫,那我得應用程式還能夠執行其他的工作。那這樣寫入資料庫,會有問題嗎?
tech_state
版主


發表:44
回覆:638
積分:641
註冊:2003-02-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-24 10:46:04 IP:61.221.xxx.xxx 未訂閱
引言: 謝謝站長的回覆 那對於現在資料庫的寫入速度我有一個想法,不知道可不可行,請各位給我一個意見好嗎?謝謝 現在我是希望將所有的資料先寫入到一個文字檔之類的文件,等待資料寫入完成之後,我再利用Thread寫入資料庫,那我得應用程式還能夠執行其他的工作。那這樣寫入資料庫,會有問題嗎?
jackwu, 您好 我想這樣可能會有問題喔 在您將資料寫入文字檔後 但尚未寫入資料庫之前 如果有其他使用者讀去該筆資料 這樣會是舊的資料 如果您的系統對即時資料的需求不大的話 您的做法或許可行 但如果即時資料的需求大的話 這個做法就有待商榷囉 還有個問題 我不是站長(請不要害,要是站長以為我要篡位怎麼辦) 只是個小小的能力不足的板主 我還是比較喜歡大家直接叫我
jackwu
一般會員


發表:28
回覆:54
積分:16
註冊:2002-08-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-24 13:12:56 IP:211.75.xxx.xxx 未訂閱
ㄚ....版主,不好意思,讓妳升級了,以後我都稱呼妳為tech_state....不好意思喔!! 然後我發現我的程式有一個小問題,不知道使否會影響資料存取的速度。 我有使用
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-04-24 13:57:35 IP:211.76.xxx.xxx 未訂閱
這樣會佔server資源沒錯, 但沒有動作的狀況下, 影響不大... 當然, 同時都在操作資料庫的話, 效能就會有所影響的.
China Join
中階會員


發表:81
回覆:242
積分:89
註冊:2003-03-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-04-24 13:57:55 IP:218.170.xxx.xxx 未訂閱
jackwu 我想要瞭解一下你目前用什麼資料庫,是不是同時開很多個 Table,這些都會影響資料寫入的速度的,如果同時有很多電腦同時要存取資料庫應該要用 Query 會比較好 ....,取資料的時候速度會差很多 
tech_state
版主


發表:44
回覆:638
積分:641
註冊:2003-02-10

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-04-24 14:04:09 IP:61.221.xxx.xxx 未訂閱
jackwu, 您好 我沒有試過這麼多台機器 不過就Client/Server的觀念來說 應該是越多人上線速度會越慢才對 我的習慣是逐個程式做控管 要用的時候才connect 不用就關掉 我想這也不是很好的方法 看看其他前輩先進有沒有什麼解決的好方法囉 ============ 是非終日有 不聽自然無
China Join
中階會員


發表:81
回覆:242
積分:89
註冊:2003-03-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-04-24 14:30:22 IP:218.170.xxx.xxx 未訂閱
如果你的量很大 > 五台,建議你中間在加一個應用伺服器會比較好 .... 另外記憶體當然也是越大越好 ....    要先瞭解問題出在那邊,才能找出解決的辦法  你的資料量有多大ㄋ,小弟昨天測試(單機)一個小時可寫入 >
jackwu
一般會員


發表:28
回覆:54
積分:16
註冊:2002-08-18

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-04-24 14:54:00 IP:211.75.xxx.xxx 未訂閱
引言:jackwu 我想要瞭解一下你目前用什麼資料庫,是不是同時開很多個 Table,這些都會影響資料寫入的速度的,如果同時有很多電腦同時要存取資料庫應該要用 Query 會比較好 ....,取資料的時候速度會差很多
現在使用的是SQL2000的資料庫,而每次要寫入資料的時候我都會將Table打開,然後再關閉,所以在同一個時間上,有可能會有多台PC將Table打開(但都只有做寫入的動作)。 那請問一下,Query的語法會比利用Table語法快多少呢?謝謝
China Join
中階會員


發表:81
回覆:242
積分:89
註冊:2003-03-12

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-04-24 16:49:45 IP:218.170.xxx.xxx 未訂閱
Table 開啟資料庫的時候都會作 select * from table 的動作,所以開啟資料庫的時間會比較久,但是寫入的速度基本上兩者是一樣的,因為他們的動作都會被轉成 SQL 程式,再由資料庫接收。 資料庫的效益和 Multi-Tier 資料庫的設計你可以參考 C Builder 6 徹底研究的這本書第 10、11、12 章
jackwu
一般會員


發表:28
回覆:54
積分:16
註冊:2002-08-18

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-04-24 23:53:50 IP:219.91.xxx.xxx 未訂閱
引言:Table 開啟資料庫的時候都會作 select * from table 的動作,所以開啟資料庫的時間會比較久
謝謝China Join 那麼上述的意思是說,如果使用Query去打開資料庫,那就不會作select * from table 的動作了喔!!如果是這樣的話,那麼在開啟資料庫的時間就不會受到資料量的多寡所影響,不知我這樣說對不對??謝謝
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-04-25 00:15:40 IP:61.221.xxx.xxx 未訂閱
china join兄的意思是使用 TTable 其實就是對 db 下 select * from table, 而使用 TQuery 時, 就看你的 sql command 的內容是什麼, 如 select top 10 * from table where col_1='Y' 這樣的狀況, 如此資料量就小得多了, 也會使資料庫的負載降低!
tech_state
版主


發表:44
回覆:638
積分:641
註冊:2003-02-10

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-04-25 23:54:41 IP:203.204.xxx.xxx 未訂閱
jackwu, 您好 請參考下面這篇文章 或許對您有幫助 http://delphi.ktop.com.tw/topic.php?topic_id=228 ======================= 是非終日有,不聽自然無
jackwu
一般會員


發表:28
回覆:54
積分:16
註冊:2002-08-18

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-04-29 11:16:37 IP:211.75.xxx.xxx 未訂閱
引言: jackwu, 您好 請參考下面這篇文章 或許對您有幫助 http://delphi.ktop.com.tw/topic.php?topic_id=228 ======================= 是非終日有,不聽自然無
謝謝版主喔!! 依照China Join的建言,給妳加分一下,版主要加油喔!!
yjpllqwr
一般會員


發表:0
回覆:3
積分:0
註冊:2003-05-08

發送簡訊給我
#18 引用回覆 回覆 發表時間:2003-05-22 10:47:45 IP:210.83.xxx.xxx 未訂閱
我来谈一些我的体会请大家指正: 1.使用线程,我的一个控制系统就是将数据操作均放入线程内.这时要注意线程同步和数据共享锁的问题. 2.对同一库的操作使用同一connection对象.用时判断一下state状态如不正常就重新链接,否则可继续使用.这样可以不用再次打开connection. liujunruanjian
------
liujunruanjian
系統時間:2024-04-24 8:11:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!