谁能够解释我的问题

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的的事件改为用存储过程也一样。

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

...全文
154 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个小时。你
们说怎么办?难道没有更好的方法吗?
我声明这两个表是没有任何关系。
非常欢迎各位零基础的同学参与我个人亲自录制讲解的Spring Boot开发入门课程!我将会带领大家从零开始,一步步地学习如何利用Spring Boot进行开发,并教授基于前后端分离编程思想的实践方法,本课程提供答疑,解决大家的课后学习问题在这个课程中,我们将使用Spring Boot作为后端框架,与前端通过JSON数据交互。前后端分离的编程思想是当前的大势所趋,在实际开发中具有很高的灵活性和可扩展性。我将详细解释这种编程思想的原理和优势,并带领大家亲自动手实现一个基于前后端分离的Spring Boot项目。即使你没有任何编程基础,也不用担心!我的课程将从头开始,由浅入深地教授Spring Boot开发的每个步骤。基础语法还是常用的,我都会在项目实现的过程中进行引导和讲解。通过实际项目的学习,你将能够熟悉开发项目中常用的工具和技术。学完我的课程后,你将能够自信地实现一个Spring Boot的后台管理项目。我们将涵盖如用户管理、登录控制、数据增删改查等常见管理功能,并通过前后端分离的方式进行数据交互。我将为你提供学习答疑的支持,确保你能够顺利掌握这些技术和概念。这个课程只是你学习java编程的起点,后续的学习和进步需要你自己不断的努力和实践。我期待与你们的相遇,并希望能一起为编程这个充满挑战和乐趣的领域努力奋斗!让我们一起探索编程的世界,共同成长!

5,388

社区成员

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

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