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

Interbase + Index 效率問題 ?

缺席
suckin
一般會員


發表:13
回覆:26
積分:7
註冊:2003-06-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-08 18:26:58 IP:211.22.xxx.xxx 未訂閱
我使用 Delphi 5 IBX FireBird1.5 Locate 一個有70000筆的資料庫, 竟然要花45秒 而且該 Table 還作了索引主鍵. 換了 Locate 沒有索引主鍵的 Table 也差不多時間. 是 fireBird (InterBase) 效率差還是我的功力差. 我也只是下了 IBTable.Locate('ID', mID, []); 語句而已. 記得使用 Interbase 時可以調整 Server 的Memory使用 數量, 那 FireBird 怎麼調整 ?
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-08 18:37:18 IP:61.66.xxx.xxx 未訂閱
引言: 我使用 Delphi 5 IBX FireBird1.5 Locate 一個有70000筆的資料庫, 竟然要花45秒 而且該 Table 還作了索引主鍵. 換了 Locate 沒有索引主鍵的 Table 也差不多時間. 是 fireBird (InterBase) 效率差還是我的功力差. 我也只是下了 IBTable.Locate('ID', mID, []); 語句而已. 記得使用 Interbase 時可以調整 Server 的Memory使用 數量, 那 FireBird 怎麼調整 ?
你使用locate語法, 當然本身就是慢, 因為 locate的搜尋方式是循序式, index起不了多少作用, 也與用firebird或interbase並無太大關係, 如果你要加速搜尋方式, 建議 使用query 'select .... where...'語法, 這樣ib的index才能發揮效能!
suckin
一般會員


發表:13
回覆:26
積分:7
註冊:2003-06-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-08 18:47:04 IP:211.22.xxx.xxx 未訂閱
因為我使用的是 IBX 套件不是BDE 套件, 1. IBTable 只有 Locate & lookup 搜尋方式, 2. IBQuery 不能像 Query 一樣設定 RequestLive=True 就可以 Access Table. 它沒這屬性. 而我這程序是在基本資料維護內供查詢用. 不可能不去增修資料. 請問使用 IBQuery 搭配那個控件才可像使用 IBTable 一般 即可存取 Table, 又可提昇查詢速度呢 ? 3Q . 3Q
Jasonwong
版主


發表:49
回覆:931
積分:581
註冊:2006-10-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-08 19:21:33 IP:61.64.xxx.xxx 未訂閱
LOCATE 的作業原理是... 先把資料都LOAD到前端(記憶體)中再作搜尋... 我想你的效率是差在這裡吧... 建議不要用LOCATE去搜尋資料 -- 聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心 傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
------
聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心
傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-09 09:59:10 IP:211.76.xxx.xxx 未訂閱
引言: 因為我使用的是 IBX 套件不是BDE 套件, 1. IBTable 只有 Locate & lookup 搜尋方式, 2. IBQuery 不能像 Query 一樣設定 RequestLive=True 就可以 Access Table. 它沒這屬性. 而我這程序是在基本資料維護內供查詢用. 不可能不去增修資料. 請問使用 IBQuery 搭配那個控件才可像使用 IBTable 一般 即可存取 Table, 又可提昇查詢速度呢 ?
1. IBTable 建議不要用, 因為你資料有70000筆, IBTable 只適用於資料很少的 Table 2. RequestLive 的使用有很多的限制, 例如: SQL 不能有 order by 之類語法 所有的 Query 更新資料都有配一個 UpdateSQL 元件, 例如: IBX 是 IBQuery 配 IBUpdateSQL(Design time 按 mouse right click 可以編輯 update fields及條件)
------
將問題盡快結案也是一種禮貌!
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-09 11:39:57 IP:61.66.xxx.xxx 未訂閱
引言: 因為我使用的是 IBX 套件不是BDE 套件, 1. IBTable 只有 Locate & lookup 搜尋方式, 2. IBQuery 不能像 Query 一樣設定 RequestLive=True 就可以 Access Table. 它沒這屬性. 而我這程序是在基本資料維護內供查詢用. 不可能不去增修資料. 請問使用 IBQuery 搭配那個控件才可像使用 IBTable 一般 即可存取 Table, 又可提昇查詢速度呢 ? 3Q . 3Q
ibx物件的標準整組元件(可以查詢, 異動) TIBDatabase->TIBTransaction->TDataSource(如果有連結DataAward元件)->TIBQuery->TIBUpdateSQL 你必須在相關的properity中把這些全部連起來 如果是只要可以做異動的話(直接在SERVER上執行異動指令) TIBDatabase->TIBTransaction->TIBSQL
suckin
一般會員


發表:13
回覆:26
積分:7
註冊:2003-06-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-09 13:21:36 IP:211.22.xxx.xxx 未訂閱
3Q 以上幾位大俠. 我之前 try 過 IBQuery+IBUpdateSQL 效率很不錯. 但在 70000筆的基本資料要找到某一筆資料確是不易.  使用 IBQuery 的 SQL 屬性 (select * from XXXXX where id="CCC") 又只能查得符條件的資料, 其他6萬多筆都被 hide 起來了. user 使用起來 哇哇叫. 真是兩難.    目前我的折衷辦法是使用二組 ....       IBQuery1 + IBUpdateSQL1 --> SQL= "SELECT * FROM table"    IBQuery2 + INUpdateSQL2 --> SQL= "SELECT * FROM table Where ID=:id"       第一組作為正常操作時用, 第二組作為查詢結果後操作用, 並在適當的地方  更換 DBNavigator 的 Datasource 的 dataset 屬性. 
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-07-09 15:17:26 IP:61.66.xxx.xxx 未訂閱
引言: 3Q 以上幾位大俠. 我之前 try 過 IBQuery IBUpdateSQL 效率很不錯. 但在 70000筆的基本資料要找到某一筆資料確是不易. 使用 IBQuery 的 SQL 屬性 (select * from XXXXX where id="CCC") 又只能查得符條件的資料, 其他6萬多筆都被 hide 起來了. user 使用起來 哇哇叫. 真是兩難. 目前我的折衷辦法是使用二組 .... IBQuery1 IBUpdateSQL1 --> SQL= "SELECT * FROM table" IBQuery2 INUpdateSQL2 --> SQL= "SELECT * FROM table Where ID=:id" 第一組作為正常操作時用, 第二組作為查詢結果後操作用, 並在適當的地方 更換 DBNavigator 的 Datasource 的 dataset 屬性. < face="Verdana, Arial, Helvetica"> 依你的操作習性來看, 之前你應該有用dos的資料庫系統開發過程式才對, 因為 在dos上的browser用法 index的確比window來的好用而且又快! 這個問題我之前也是十分困擾, 因為我希望可以讓user看到全部, 又可以很快 速的找到user要的記錄位置, 但window難兩全, 漸漸的我改掉我自己的堅持 其實你可以用一組 IBQuery2 INUpdateSQL2 --> SQL= "SELECT * FROM table Where ID like :id" '*' (應該是這樣沒錯吧!) 這樣的語法取得一個範圍的記錄, 再用locate來執行, 速度上絕對會快很多! 如果你堅持這樣的操作方式的話!
系統時間:2024-05-18 15:52:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!