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

TDataSetProvider.GetRecord() 读取数据速度慢

尚未結案
paulln
一般會員


發表:1
回覆:0
積分:0
註冊:2007-09-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-09-14 14:48:19 IP:122.9.xxx.xxx 訂閱
aData: OleVariant;
ADODataSet.CommandText:="select t.*,gs.Id As 公司ID,gs.公司名称,zm.Id As 账目ID,zm.账目名称,jh.Id As 计划id,jh.计划名称,gc.工程编号,gc.工程名称 ,sgd.名称 as 施工队名称,yh.姓名 as 登记人,yhsh.姓名 As 审核人员,hzplan.汇总表id,zt.名称 As 状态名称,decode(t.施工队性质,'0','内部施工队','1','外部施工队') as 内外施工队
from 材料计划申请表 t,工程表 gc,施工队 sgd,Dic_状态 zt,计划表 jh,账目表 zm,公司表 gs,系统_用户表 yh,系统_用户表 yhsh,已汇总材料计划 hzplan
where t.工程id=gc.Id And t.审批状态=zt.代码( ) And zt.对象='材料计划申请' and gc.计划id=jh.id and jh.账目id=zm.id and zm.公司id=gs.id and t.id=hzplan.申请表id( ) and t.施工队ID=sgd.id and t.登记人id=yh.Id And t.审核人员id=yhsh.id( ) and ((审批状态='9' or 审批状态='7'))"
//语名1
aData:=TDataSetProvider.GetRecords(-1,aRecsOut,ord(GrReset)); //需时30秒
其中TDataSetProvider的dataset是一个ADODataSet,ADODataSet查出600多条记录,在PL/SQL里面直接运行该ADODataSe的SQL耗时1秒钟。但是中间件运行“语名1”耗时30秒,客户端反应变得非常慢,请问怎么提高速度??谢
VICSYS
初階會員


發表:21
回覆:64
積分:32
註冊:2002-10-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-09-22 20:10:13 IP:139.175.xxx.xxx 訂閱
在PL/SQL裡面直接運行該ADODataSe的SQL耗時1秒鐘?
這是什麼? 您是說用 SQL Plus 嗎? 那麼有沒有把 600 筆全部讀完?
如果沒有, 請試著把它讀完!
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-10-01 23:16:02 IP:222.68.xxx.xxx 訂閱
TDataSetProvider+ADO是比较慢,请看我那篇用ADO Stream实作3层的文章。
不过600条要30秒好像离谱了点,DataSet没有关联到什么vcl上去引起不断刷新了吧?
------
江上何人初见月,江月何年初照人
VICSYS
初階會員


發表:21
回覆:64
積分:32
註冊:2002-10-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-10-02 01:17:01 IP:139.175.xxx.xxx 訂閱
在三層的情況下, 我大多使用 DBX! 也測試過 ADO 的連線! 速度應該沒有這麼離譜!

如果用 SQL Plus 全部讀完 600 筆, 只要一秒!
那麼排除 Oralce 在讀取資料時, 花了太多時間!

ADODataSe的SQL耗時1秒鐘? 我還是不知道這是指什麼!

所以, 以下只好亂猜! 反正現在很閒 :)

這是問題2:
將 QUERY 改用 VIEW 來完成! 主要測試 ADO 是否自行做一些解譯的動作!
不知道您有沒有空回答上述的問題呢?

我想! 您應該只是這個 Query 很慢. 其他都很快! 所以排除
1. ADO CONNECT 時間過慢
2. CursorLocation 有做調整, 或者是用 clUseClient
3. CursorType 有做調整 或用 ctOpenForwardOnly
如果其他的 Query 都很慢, 那麼上述都成了問題....

我想, 最好的方式是, 您自行用中斷點, 一步一步追縱!

function TCustomProvider.GetRecords(Count: Integer; out RecsOut: Integer; Options: Integer;
const CommandText: WideString; var Params, OwnerData: OleVariant): OleVariant;
begin
Result := DoGetRecords(Count, RecsOut, Options, CommandText, Params, OwnerData); <- BreakPoint
end;
系統時間:2024-04-19 8:44:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!