关于速度的问题(100分)

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

fstao

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库为mssql7,有三个表“dbo.销售单”、“dbo.产品库”和“dbo.区域库”。表“dbo.销售单”的字段为(id、name、product_id、Area_id,其中
product_id是关联“dbo.产品库”,Area_id是关联“dbo.区域库”)。假如要
看到“dbo.销售单”的产品名称和区域,就必须打开“dbo.产品库”和“dbo.
区域库”。假如表“dbo.销售单”有将近6000条记录,而“dbo.产品库”和
“dbo.区域库”分别不到20条记录。
有两个问题:
(1)、假如先打开表“dbo.销售单”,然后再打开“dbo.产品库”和“dbo.区
域库”(我都是用tquery来打开的),发现要等待好久才把三个表打开(大约50
秒),但是我先打开“dbo.产品库”和“dbo.区域库”,然后再打开表“dbo.销
售单”,只用不到2秒,很快,有谁能解释?
(2)、如果依次打开“dbo.产品库”、“dbo.区域库”和“dbo.销售单”,只
用不到2秒钟,很快,但是我用关闭“dbo.产品库”或“dbo.区域库”其中的一
个表,然后再打开“dbo.产品库”或“dbo.区域库”其中的一个表,发现很慢
很慢,大约要50秒,只有关闭“dbo.销售单”,再打开“dbo.产品库”或dbo.
区域库”其中的一个表就很快,不用1秒时间。请问如何解释?
我声明一下我打开表是用Tquery的“select id,... from dbo.表???”,然
后Tquery.open来打开的。
 
没有人知道吗?我现在就是没有关联,也要先打开记录比较大的表,然后再打开记录
比较小的表就快得多,为什么呢?
 
dbo.销售单有19个字段,其它两个不超过5个字段。我一打开就把三个表的所有字段
全部打开了。就是不知道先打开销售单,然后再打开其它两个表就慢很多,而先打开
产品库和区域库,再打开销售单,就快很多,大概不到2秒。
 
也许:

用系统监视器查看网络客户流量,在上述两种情况下是否有变化。如果有,则是
SQL语句没写好,或索引没建好。最好用存储过程。
也可能是关联上的错。一般,我不用关联,而是写程序检验。
 
与这个问题类似的也有人提过,
这主要与SQL服务器的页调度有关,详细的应查看SQL服务器的管理机制。
“销售单”的数据与“产品表”和“区域表”都有关系,
所以,在打开“销售单”时,“产品表”与“区域表”的内容已经调入catch,
并且作了关系映射。
先打开代码表,SQL服务器,为20-30条记录作一次页调度,当又打开“销售单”时,发现代码表与该表有关系,又要重新页调度,建立关系。读数据不慢,关键是页调度和优化处理慢。
试着:
1)做SQL服务器的优化配置。查看配置资料。
2)应用中,相互关联的表,最好先打开业务主表、业务附表、在打开信息表、代码表。
3)试试在每个开表完毕后作个“commit;"处理。
 
王亮:
1、如何做SQL服务器的优化配置?如何查看配置资料?
2、以前三个表都是用Tquery的,也是用tquery来关联区域库和产品库的,我现在把
销售库(Tquery)与区域库(Tquery)和产品库(Tquery)去掉。按你说,SQL服务器它
如何知道“dbo.销售库”与“dbo.区域库”和“dbo.产品库”关联呢?
3、在哪里写“commit”呢?
 
别用TDataSource传递参数!
手工写SQL好了
如果要效率,用存储过程或者VIEW会比较快
 
我现在是这样做:
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的的事
件改为用存储过程也一样。


 
难道没有人做过处理10000条以上的数据吗?
 
其实大家也可以这样试:
安装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个小时。你
们说怎么办?难道没有更好的方法吗?
我声明这两个表是没有任何关系。
 
没有人知道吗?
 
大概和事务机制有关吧,第一次打开建立了缺省的事务
并且建立相应的缓存区,第二次就不需要了.
sql server 也负责一些数据库与应用程序的连接方面
的事情,第一次连接总是要花很多时间的。
可以参考有关数据库原理的书。
 
多人接受答案了。
 
后退
顶部