谁能够解释我的问题

fstao 2000-05-03 09:23:00
数据库是mssql7
1、
Query1连接“dbo.销售库”,在query1新建一个计算
字段Price(此字段是用来关联dbo.产品库的price),在query1的onCalcFields事件:
with query4 do
begin
close;
sql.clear;
sql.add('select price from dbo.产品库 where id=:id');
parambyname('id').Asfloat:=query1product_id.value;
open;
end;
query1price.value:=query4.fields[0].value;

在button1里写入代码:
query1.close;
query1.open;
在button2里写入代码:
with query3 do
begin
close;
sql.clear;
sql.add('update dbo.产品库 set sign=''yes'' where id=:id');
parambyname('id').Asfloat:=3;
execsql;
end;

运行时,我发现无论按button1多少次,都很慢很慢,但是无论按button2多少次就非
常快。如何解决很慢的问题?

2、
我把query1的price改为lookup字段(price是用来关联query4的price字段),query4连接“dbo.产品库”。
在button1里写入代码:
query1.close;
query4.close;
query4.open;
query1.open;
在button2里写入代码:
with query3 do
begin
close;
sql.clear;
sql.add('update dbo.产品库 set sign=''yes'' where id=:id');
parambyname('id').Asfloat:=3;
execsql;
end;

运行时,我发现无论按button1多少次,都很快,但是第一次按button2就非
常慢,但从第二次开始就非常快。如何解决第一次非常很慢的问题?我就是把
button2的的事件改为用存储过程也一样。

3、
我把button1里代码改为:
with query1 do
begin
close;
sql.clear;
sql.add('SELECT s.salary_no, s.name, p.product_name, s.postalcode, s.address, s.units, s.c_method,A.Area');
sql.add(',s.quantity, s.pam, s.p_level_id, s.g_date, s.memo, s.sign, s.prt_time, s.prt_date, s.press_recorder, s.c_date');
sql.add('FROM Salary_Storage S , product_storage P,Area A where S.Area_id=A.id and S.product_id=p.id and s.id <''4000''');
open;
end;

在button2里写入代码:
with query3 do
begin
close;
sql.clear;
sql.add('update dbo.product_storage set sign=''yes'' where id=:id');
parambyname('id').Asfloat:=3;
execsql;
end;

运行时,我发现无论按button1多少次,都很快,但是第一次按button2就非
常慢,但从第二次开始就非常快。如何解决第一次非常很慢的问题?我就是把
button2的的事件改为用存储过程也一样。

你有什么好的方法?是不是数据库机制的问题呢?

...全文
146 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
江王 2000-05-04
  • 打赏
  • 举报
回复
1.计算字段的计算事件中有能每次都打开结果集,因为打开结果集是一个很费时的一件操作。为何不这么写:
在计算之前打开'select id, price from dbo.产品库'这个结果集,然后用结果集的Locate方法来根据id查找你所需要的price,这样速度会快很多。
2,3中的根本问题是你第一个查询是一个Master-detail型的结果集,而detail表恰好是产品库表;另外你的Update语句做的操作又是产品库表。造成速度慢的原因在Delphi的VCL库本身,它在做Master-Detail操作时可能会锁住数据库表,这样更改操作会被阻塞,速度当然会很慢。至于第二次为什么会很快,是因为你的第一次已经对数据库作为更改,第二次做同样的操作,和没做一样,当然很快了。
lyxinfo 2000-05-04
  • 打赏
  • 举报
回复
对不起!,我只能在Delphi环境下运行时才能重现您的问题(正如您所说用Northwind库),运行可执行文件时,无论如何速度都很快.另外,在编程环境下,如果Query1与Query2不使用同一个连接,则速度也都很快,我想这可能跟Delphi环境有关.(我的试验环境W2k,D5,MSSQL7).关注!
Ardus 2000-05-03
  • 打赏
  • 举报
回复
1.慢是因为onCalcFields事件会触发很多次,每显示一条记录就会触发一次,
2.3.4的Button2的代码写的全吗?光Query3那么一段代码不应该慢。
fstao 2000-05-03
  • 打赏
  • 举报
回复
其实也可以这样试:
安装mssql7,它自带一个数据库“Northwind”,里面有一个表“Order Details”
它大约有2155条记录,有5个字段。我现在添加一新表dbo.table1,字段为id,name,记录为空。
我先执行button1的onclick事件:
with query1 do
begin
close;
sql.clear;
sql.add('select * from [order details]');
open;
end;

速度很快。不要关闭query1,再执行button2的onclick事件:
with query2 do
begin
close;
sql.clear;
sql.add('update table1 set name=''''');
execsql;
end;

发现第一次执行要2秒多,第二次开始就不用半秒钟。如果再按一次button1,很快就
打开,然后再按button2,就要2秒多,从第二次开始就不用半秒钟。 表
“Order Details”才有2155条记录,才有5个字段,如果有上百万条记录或者上千
万条记录,有十几个字段,打开它后,按button2,那就要等待半小时或1个小时。你
们说怎么办?难道没有更好的方法吗?
我声明这两个表是没有任何关系。

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧