在程序中执行存贮过程比在查询分析器执行慢很多,为何?(100分)

  • 主题发起人 主题发起人 flysand
  • 开始时间 开始时间
F

flysand

Unregistered / Unconfirmed
GUEST, unregistred user!
在查询分析器中执行存贮过程,该进行若干句查询后,
只返回一条提示信息,用不到一分钟,
客户端用Tclientdataset传接递SQL命令
(clientdataset.commandtext='exec myproc')
给DCOM服务器的tprovider,服务器用ado连接mssql2000,执行该过程却用了7、8分钟,
有时还运行不下去,不知什么回事!
 
当然啦,msSQL有对它的视图和存贮过程进行了优化处理,所以速度当然快啦。
如果可以的话,尽量使用视图和存贮过程以提高速度
 
我就是在客户端简单执行一个sql2000的贮存过程,
但就是比在查询分析器中慢太多
 
不对,这种现象我也碰到过,不知到为什么
 
应用程序将进行不同的方式传递消息
 
由于该存贮过程有一个比较长循环,
在查询分析器中运行时,每循环一次,
消息框中就出现一句提示(所影响的行数为 1 行),
是不是该原因呢?
我想该消息没有传到应用服务器,不会影响运行速度吧!
 
你执行的存储过程传递的数据多不多,如果多的话,有可能在服务器要把这些数据转换为特殊的形式传送,
到客户端再把数据类型变换过来,比如web service中有一个Base64 Encoding/decoding过程,
DCOM具体运作不太清楚,可能会有类似的过程。
 
您把方法写到应用层,不会出现您说的那种情况的。我还第一次听说三层结构的存储过程
在到前台来执行。在应用层写一个方法。然后客户端去调用就行了。
 
to jinmen,
存储过程传递到客户端的数据只有一无句
to billrobin,
我只是在客户端发出执行存储过程的命令,执行当然是在后台进行!
我试一下有服务器写一个方法让客户端执行看看....
 
您的方法是怎么写的,贴出来。存储过程的执行速度是很快的呀?我写的中间层存储过程
执行方式:
function TFLAGMTLMETHOD.CancelRepriteBill(const MyXLH, MyWZXXBM,
MyJCDWBM: WideString): OleVariant;
begin
try
if not DatabaseCompanion.Connected then
DatabaseCompanion.Connected:=True;
StoredProc4.Close;
StoredProc4.UnPrepare;
StoredProc4.Params[0].AsString:=MyXLH;
StoredProc4.Params[1].AsString:=MyWZXXBM;
StoredProc4.Params[2].AsString:=MyJCDWBM;
StoredProc4.Prepare;
StoredProc4.ExecProc;
Result:=StoredProc4.ParamByName('as_return').AsString;
except
Abort;
end;
end;
客户端直接用appserver调用这个方法就行了。速度很快。
 
to billrobin,
一次更新5万条记录在查询分析器中用2-3分中,但在程序中用10多分钟.
我想知道为何?
procedure 如下:
create procedure myproce
@FDATE:DATETIME
as
declare
@iinum int,
@num int
DECLARE MYCUR CURSOR FOR
SELECT iinum ,num
FROM MACCITEMS WHERE fdate>=@fdate
open MYCUR
FETCH NEXT FROM MYCUR INTO @iinum , @num
begin
TRANSACTION
WHILE @@FETCH_STATUS = 0 begin
UPDATE TABLE1 SET BNUM=@BNUM WHERE IINUM=@IINUM
FETCH NEXT FROM MYCUR INTO @iinum , @num
END
commit TRANSACTION
CLOSE MYCUR
DEALLOCATE MYCUR
select '全部完成记帐工作'
 
如果是5万条记录。3分钟,差不多。您用的是SQL SERVER吧?您把游标的循环类型
改一下。看能不能提高点效率。您是怎么调用存储过程的。或者与您的bde参数有关。
试着改一下看看。。。希望您能提供更多的信息,以便我们帮您分析。
 
加大BDE缓存。
 
To flysand:
你的儲存過程要返回的數據量是不是很大?大概有多少條記錄?如果記錄多的話有影響.
To billrobin:
調用了CancelRepriteBill返回的是一條記錄吧,傳到客戶端當然快.如果你在中間層要
返回5萬條記錄就慢了.
 
老兄,怎么会返回5万条记录呢?它已经在ORACLE数据库服务器里面已经处理完了。返回
客户端的只是运算成功还是失败。是一个返回值。我给您这样说,不管用2什么前台程序
进行开发。开发语言最终要翻译成SQL在数据库里运算。所以。为什么存储过程执行得快呢
与这个有很大的关系。
 
billrobin老兄,謝謝你的回復,我想問一下:
在客戶端通過中間層瀏覽50,000條記錄,跟通過中間層瀏覽1條記錄所耗的時間一樣嗎?
我也正在研究這一個問題,因此興趣較大.
 
To billrobin:
我是用ADO连接,的储存过程只是一个例子
客户端用Tclientdataset传接递SQL命令(clientdataset.commandtext='exec myproc')
给DCOM服务器的tprovider,服务器用ADO连接mssql2000,执行该过程却用了7、8分钟,
就想知道为何!
 
经过测试,发现是ado连接的问题,就是说:
用ado连接sql server执行储存过程比在查询分析器中慢很多,
为何?如何解决该问题?
 
按理说,查询分析器或程序中执行存储过程,
实际都是在sql server中执行,再输出返回值,
为何运行速度有这样大区别呢?
 
后退
顶部