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

ADO連線資料庫的問題

缺席
yuhboy
一般會員


發表:12
回覆:27
積分:12
註冊:2004-11-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-07-06 14:55:16 IP:140.116.xxx.xxx 訂閱
最近在寫 delphi 一直有個疑問
我使用 ADOConnection ADODataset
或 ADOConnection ADOQuery
在查詢時常發生個現象
程式第一次執行時在查詢時會跑很久,最後就出現查詢逾時的訊息

但同樣的條件
第二次再點查詢時,感覺查詢的速度變快了,也不會出現逾時的問題了
都在相同的條件下,為何第一次都會出現象逾時呢

有無方法可以克服此一問題呢

要請各位大大解惑囉

謝謝
編輯記錄
taishyang 重新編輯於 2007-07-06 15:02:57, 註解 將文章分類成[問題]‧
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-07-06 16:30:06 IP:211.22.xxx.xxx 未訂閱
只有你自己知道你的Database Table裡面有多少欄位,以及各個欄位的型態是何種?欄位愈多且其型態愈複雜(如Image之類等等)則所傳回的資料集要花費愈多的時間!
因此,SQL敘述式除了僅Select所要操作的欄位也要學習寫的精簡有效率,不要偷懶只打星號(*),那麼效率會很差!另外,第二次查詢之所以加快的原因,,個人認為是因為第一次的資料集在Local Client已經有了Cache所以速度才會快.
yuhboy
一般會員


發表:12
回覆:27
積分:12
註冊:2004-11-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-07-06 16:44:11 IP:140.116.xxx.xxx 訂閱

===================引 用 Stallion 文 章===================
只有你自己知道你的Database Table裡面有多少欄位,以及各個欄位的型態是何種?欄位愈多且其型態愈複雜(如Image之類等等)則所傳回的資料集要花費愈多的時間!
A:精簡我當然了解,但所需的欄位就那麼多,我也沒辨法
因此,SQL敘述式除了僅Select所要操作的欄位也要學習寫的精簡有效率,不要偷懶只打星號(*),那麼效率會很差!另外,第二次查詢之所以加快的原因,,個人認為是因為第一次的資料集在Local Client已經有了Cache所以速度才會快.
A:如果是Cache的問題,能否在程式一開始執行時,就讓程式有預先做好準備的方法嗎,或許比較佔記憶體也沒關係
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-07-09 18:09:08 IP:61.222.xxx.xxx 訂閱
請試著找出問題。
1. 是資料庫的問題嗎?用哪一種資料庫。
2. Select 資料超過幾筆才會逾時,是資料太多筆數的原因嗎?
HireMan
一般會員


發表:0
回覆:12
積分:2
註冊:2004-12-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-07-21 16:06:38 IP:121.204.xxx.xxx 訂閱
1、第一次慢,第二次开始会好些,是否可能是由于第一次时你的adoconnection还未与资料库连接,所以第一次他要跑资料库连接,
2、第二个问题当取数,最后数据集先与数据敏感控件脱离,等取完数据后再连接上,这也会有效率偏差。
===
分享快乐:www.delphichm.com
yuhboy
一般會員


發表:12
回覆:27
積分:12
註冊:2004-11-01

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-07-24 16:47:44 IP:140.116.xxx.xxx 訂閱
謝謝這位 HireMan 大大的回覆

如你所說的問題在於建立 adoconnection 的問題
那我有沒有辨法在程式一執行時,便建立好連線...
希望能夠因此增加執行效率

謝謝

===================引 用 HireMan 文 章===================
1、第一次慢,第二次开始会好些,是否可能是由于第一次时你的adoconnection还未与资料库连接,所以第一次他要跑资料库连接,
2、第二个问题当取数,最后数据集先与数据敏感控件脱离,等取完数据后再连接上,这也会有效率偏差。
===
分享快乐:www.delphichm.com
HireMan
一般會員


發表:0
回覆:12
積分:2
註冊:2004-12-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-07-24 23:34:31 IP:125.77.xxx.xxx 訂閱
连接资料库可以放在应用程序执行时连接,之后不要CLOSE这个Session,对后期的Dataset要连接的取数的话可以直接使用连接,便可连接上去。还有一点你可以改用recordset来处理?
====
回过头来想问你一个问题,你在取数慢慢要多少时间?取多少笔资料。(看是否可帮上:))

===
分享快乐:www.delphichm.com
yuhboy
一般會員


發表:12
回覆:27
積分:12
註冊:2004-11-01

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-10-20 09:36:16 IP:140.116.xxx.xxx 訂閱
其實問題並不在筆數的問題

因為筆數都相同
我的習慣大概是如此

procedure button1_Click 動作按下去後
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add(SQL語法);
adoquery1.open;

但是這樣子的做法
會出現第一次click 要等很久
當第一次跑完後,再點第二次時
明顯不用等那麼久了

有時按第一次會等到出現逾時的問題
之後再重新再按一次,就跑得出資料了


你們不覺得這樣子很怪嗎

之前我在用 vb 6 寫程式時,也不會有這樣的問題

我懷疑是 delphi 中 ADO元件的問題

我是用 delphi 2006

資料庫是放在區網中別台主機上,而不是 local 端

希望這樣子的陳述,有助於大家了解我的問題點
Louis_H
一般會員


發表:7
回覆:19
積分:10
註冊:2005-10-07

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-10-20 10:12:59 IP:64.62.xxx.xxx 未訂閱
procedure button1_Click 動作按下去後
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add(SQL語法);
adoquery1.open;

您好!我也是有遇過您這樣的問題,後來其實有作下列幾點修正,給您參考:
1. SQL 語法 再仔細調整一番,以達最佳化效率目的,比如少用Select * 而用 Select Fieldname
及 From table 如果有 Join 最好按照實際 Table record 由 大 到 小 排列.
2.上述程序碼在 adoquery1.open 前,我是會再加一段
if (Not adoquery1.Prepared) then adoquery1.Prepared;

以上,希望對您有所幫助.
wuabc
初階會員


發表:6
回覆:60
積分:33
註冊:2002-10-28

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-10-20 23:34:47 IP:203.204.xxx.xxx 訂閱
第一次慢,第二次以後快,應是正常狀況,
此與Delphi或VB應該無關,

至於Timeout問題,
Delphi的TADOQuery是為了向下相容而設,
Timeout的時間預設應是30秒,無法改變,

TADODataset才是建議使用的元件可以改變
Property CommandTimeout (不確定名稱是否正確)
來改變Timeout, 預設好像也是30秒
yuhboy
一般會員


發表:12
回覆:27
積分:12
註冊:2004-11-01

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-10-20 23:53:01 IP:61.225.xxx.xxx 訂閱
第一
TADOQuery 這個元件也有 TimeOut 的屬性,OK

第二
若 delphi 必需第一次慢,第二次之後才快
我覺得不合理

難道我給使用者的程式,要先跟他們說,第一次程式一定會當掉
再重開程式再跑一次就會正常了

我應該會被炒魷魚吧

我是希望能找到克服的方法,而不是要知道這是正常的狀況

這樣子的話

那我乾脆放棄 delphi 改用 vs 2005 好了
至少我試過不會有類似的問題
===================引 用 wuabc 文 章===================
第一次慢,第二次以後快,應是正常狀況,
此與Delphi或VB應該無關,

至於Timeout問題,
Delphi的TADOQuery是為了向下相容而設,
Timeout的時間預設應是30秒,無法改變,

TADODataset才是建議使用的元件可以改變
Property CommandTimeout (不確定名稱是否正確)
來改變Timeout, 預設好像也是30秒
wuabc
初階會員


發表:6
回覆:60
積分:33
註冊:2002-10-28

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-10-20 23:56:44 IP:203.204.xxx.xxx 訂閱
沒絕決你的問題,
對不起,
加油囉
agogorz
初階會員


發表:9
回覆:34
積分:28
註冊:2005-04-09

發送簡訊給我
#13 引用回覆 回覆 發表時間:2007-10-30 17:47:44 IP:59.124.xxx.xxx 訂閱
SQL不清楚,ORACLE要查到30秒以上大概是資料量以百萬筆計算了,
如果是MYSQL的話就有可能正常資料而TIME OUT。
你提到可否先CACHE下來,我是認為,正常的情況都是要Query資料的,
很難想像vs2005可以而delphi會過久,因為基本上資料庫的查詢是不會差多少的,
若真的需要幫助,請提供你的資料庫型態及大小,以下兩篇供參考,亦可自行搜尋ado 查詢
http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=43234
http://delphi.ktop.com.tw/board.php?cid=30&fid=68&tid=53964
系統時間:2024-05-17 10:28:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!