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

資料庫讀取的速度很慢很慢.

答題得分者是:GrandRURU
brook
資深會員


發表:56
回覆:321
積分:365
註冊:2002-07-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-08-06 14:50:12 IP:60.251.xxx.xxx 訂閱
1.我用的資料庫是DbMaker3.7,資料庫放在另一部主機,應該不是DbMaker的問題,因為別人的程式只要一秒,而我的程式卻要一分鐘.
2.資料筆數約6000筆,應該不是太大.
3.程式很簡單,TDatabase,TQuery,TDataSource,TDBGrid各拉一個,再加上兩個TButton.
4.TButton裡的內容也很簡單,如下:(幼稚園程度而己)
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("SELECT * FROM Orders");
Query1->Open();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Query1->Last();
}
5.我的問題是:按Button1只要5秒就搞定,但再按Button2卻要1分多鐘?要客戶等15秒就沒耐心了,何況一分鐘.
(執行一次後就快了,可能是第一次會把資料全部複製過來吧.)
6.是有什麼屬性沒設好?還是用索引檔能解決?還是換成VB算了?
brook
資深會員


發表:56
回覆:321
積分:365
註冊:2002-07-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-08-30 13:12:20 IP:60.251.xxx.xxx 訂閱
不知各位大大可否提供一些解決方案?或測試的方向?
1.目前我資料筆數約2萬筆.
2.用TTable代替TQuery,則執行Last(),花不到一秒.
3.用bcb5,bcb6,bcb2010用TQuery,執行Last()也是花了一分多鐘,但執行一次即正常.
tobylin
一般會員


發表:1
回覆:15
積分:18
註冊:2009-12-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-08-30 13:24:09 IP:60.249.xxx.xxx 未訂閱
如果Orders 的 Primary Key 是 ord_id,

Query1->SQL->Add("SELECT * FROM Orders WHERE ord_id IS NULL"); // ORACLE資料庫

===================引 用 brook 文 章===================
1.我用的資料庫是DbMaker3.7,資料庫放在另一部主機,應該不是DbMaker的問題,因為別人的程式只要一秒,而我的程式卻要一分鐘.
2.資料筆數約6000筆,應該不是太大.
3.程式很簡單,TDatabase,TQuery,TDataSource,TDBGrid各拉一個,再加上兩個TButton.
4.TButton裡的內容也很簡單,如下:(幼稚園程度而己)
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("SELECT * FROM Orders");
Query1->Open();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Query1->Last();
}
5.我的問題是:按Button1只要5秒就搞定,但再按Button2卻要1分多鐘?要客戶等15秒就沒耐心了,何況一分鐘.
(執行一次後就快了,可能是第一次會把資料全部複製過來吧.)
6.是有什麼屬性沒設好?還是用索引檔能解決?還是換成VB算了?
brook
資深會員


發表:56
回覆:321
積分:365
註冊:2002-07-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-08-30 14:20:22 IP:60.251.xxx.xxx 訂閱
很感謝tobylin大大的回答,但速度還是一樣.
//我用 Query1->SQL->Add("SELECT * FROM KmOrders WHERE A <> 0");


GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-08-30 16:07:08 IP:203.75.xxx.xxx 未訂閱
試試看不要用Select *,改用Select 欄位1,欄位2試試看

不過,你所謂別人的程式,它是用什麼方式來連接dbmarker?

如果是原生的連接法(像是ado搭配ms sql),bde是一定不會比它快的。

如果是用ODBC,我相信速度不會差這麼多才是。
brook
資深會員


發表:56
回覆:321
積分:365
註冊:2002-07-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-08-31 12:07:21 IP:60.251.xxx.xxx 訂閱
感謝GrandRURU大大回答.
用Select 欄位1,欄位2會快很多,約2秒,但這些欄位幾乎都會用到.
我用TADOQuery開就要花一分多鐘,用TQuery,TTable開都約2秒,但Table1->Last();花不到1秒,用Query1->Last();卻要1分鐘.


===================引 用 GrandRURU 文 章===================
試試看不要用Select *,改用Select 欄位1,欄位2試試看

不過,你所謂別人的程式,它是用什麼方式來連接dbmarker?

如果是原生的連接法(像是ado搭配ms sql),bde是一定不會比它快的。

如果是用ODBC,我相信速度不會差這麼多才是。
小蟲蟲
一般會員


發表:38
回覆:55
積分:23
註冊:2002-03-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-09-06 16:52:14 IP:219.87.xxx.xxx 訂閱
這可能要看一下李維大師在Delphi 7的經典名著。

想當年,凌群剛推出dbmaker時,我朋友還是他們早期的試用者之一。
記得他們有給Delphi用的原生API,速度比較快,不知你有沒有拿到?


===================引 用 brook 文 章===================
感謝GrandRURU大大回答.
用Select 欄位1,欄位2會快很多,約2秒,但這些欄位幾乎都會用到.
我用TADOQuery開就要花一分多鐘,用TQuery,TTable開都約2秒,但Table1->Last();花不到1秒,用Query1->Last();卻要1分鐘.

系統時間:2017-10-21 12:41:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!