M
myname
Unregistered / Unconfirmed
GUEST, unregistred user!
我用D5+SQL7建立了一个三层系统,远程数据模块为TSession+
Tdatabase+Tquery+Tdatasetprovider,一直以来运行非常正常,正暗自高兴,
忽然有一天,用SQL Monitor检查了一下执行情况,才发现两个大问题。
一、假设有两个Tquery,SQL语句分别为Select * from table1;
Select * from table2,客户端用两Clientdataset与之相联,Packedreacord
均为20,当打开第一个Query时,SQL Monitor可以清楚看到有二十个
Fetch语句,一切正常,但这时再打开第二个Query,怪事发生了,它会
先将Query1余下的所有记录全部Fectch过来,再执行Select * from table2,
也就说,假定table1有一万条记录,打开时,会先取20条,如果这时再打开
其它query,就会先将余下的9980条记录全下到应用程序服务器(不会下到
客户端),再打开其它查询,反之亦然,速度非常慢。
其时这一问题也好解决,给每一个query指定不同的databasename就行,
但如果有数十个Query,是不是很烦,也很不好维护。
二、如果只有一个query,不会出问题吧。NO,你试着修改一个值,再
保存看,同样的事情又发生了,它会先将所有余下的记录全下应用程序服务器,
再保存。记录少,不会有什么感觉,但记录多,可就够等了,怪不得经常有
人抱怨Applyupdates慢了。
这两个问题不止是三层,C/S也如此,由于其极大的影响程序的执行效率,
必须解决,几天来也想了不少办法,但总觉不够理想,以下是一些偿试。
一、实际上造成这一问题的根源就在SQL语句上,如果SQL语句不加
Where限制条件,面对所有记录,就会出现这一问题,但如果SQL语句每次
只返回不多的记录,虽然仍旧会传余下的记录,但由于记录不多,也就无有谓。
但这样的SQL语句不好写啊!比如怎样写才能20条20条的往下返回,
我办不到,甚至20条左右都不行。
二、用ADO:Select top 20 * From table1 Where key>???,
这条语句是可以每次往下返回20条记录的,但ADO不够稳定(第一次出现
的东西都这样),并且SQL Monitor无法跟踪ADO,怎么敢用。
三、用Ttable代替Tquery,说实话,这样做效果非常好,两个问题
立即荡然无存,数据存取的效率非常高,但现在几乎所有的文章都劝不用
Ttable,论坛更是如此,不知道Ttable会不会有其它毛病,所以一直下
不了决心。
四、数据的存取全部自己写,不用Delphi代劳,这样做当然是可行了,
但劳动强度是不是太大了,并且出的问题肯定也不会少。
我已经无计可施了,各位大侠有何高见。
Tdatabase+Tquery+Tdatasetprovider,一直以来运行非常正常,正暗自高兴,
忽然有一天,用SQL Monitor检查了一下执行情况,才发现两个大问题。
一、假设有两个Tquery,SQL语句分别为Select * from table1;
Select * from table2,客户端用两Clientdataset与之相联,Packedreacord
均为20,当打开第一个Query时,SQL Monitor可以清楚看到有二十个
Fetch语句,一切正常,但这时再打开第二个Query,怪事发生了,它会
先将Query1余下的所有记录全部Fectch过来,再执行Select * from table2,
也就说,假定table1有一万条记录,打开时,会先取20条,如果这时再打开
其它query,就会先将余下的9980条记录全下到应用程序服务器(不会下到
客户端),再打开其它查询,反之亦然,速度非常慢。
其时这一问题也好解决,给每一个query指定不同的databasename就行,
但如果有数十个Query,是不是很烦,也很不好维护。
二、如果只有一个query,不会出问题吧。NO,你试着修改一个值,再
保存看,同样的事情又发生了,它会先将所有余下的记录全下应用程序服务器,
再保存。记录少,不会有什么感觉,但记录多,可就够等了,怪不得经常有
人抱怨Applyupdates慢了。
这两个问题不止是三层,C/S也如此,由于其极大的影响程序的执行效率,
必须解决,几天来也想了不少办法,但总觉不够理想,以下是一些偿试。
一、实际上造成这一问题的根源就在SQL语句上,如果SQL语句不加
Where限制条件,面对所有记录,就会出现这一问题,但如果SQL语句每次
只返回不多的记录,虽然仍旧会传余下的记录,但由于记录不多,也就无有谓。
但这样的SQL语句不好写啊!比如怎样写才能20条20条的往下返回,
我办不到,甚至20条左右都不行。
二、用ADO:Select top 20 * From table1 Where key>???,
这条语句是可以每次往下返回20条记录的,但ADO不够稳定(第一次出现
的东西都这样),并且SQL Monitor无法跟踪ADO,怎么敢用。
三、用Ttable代替Tquery,说实话,这样做效果非常好,两个问题
立即荡然无存,数据存取的效率非常高,但现在几乎所有的文章都劝不用
Ttable,论坛更是如此,不知道Ttable会不会有其它毛病,所以一直下
不了决心。
四、数据的存取全部自己写,不用Delphi代劳,这样做当然是可行了,
但劳动强度是不是太大了,并且出的问题肯定也不会少。
我已经无计可施了,各位大侠有何高见。