三层结构中获取数据的速度问题,急!(100分)

  • 主题发起人 主题发起人 zag2000
  • 开始时间 开始时间
Z

zag2000

Unregistered / Unconfirmed
GUEST, unregistred user!
我分别用三层MIDAS结构和两层直连数据库结构来实现查询数据,发现数据量越大,两者速
度的差距就越大。三层的中间服务器使用ADO连接数据库,前端使用TClientDataSet连接中
间服务器;两层直接使用ADO连接数据库。速度比较如下:
记录数 三层花费的时间 两层花费的时间
200 0.1 s 0.05 s (2倍左右)
20,000 23 s 2.1 s (10倍以上)
速据量越大,三层结构需要的时间比两层要多很多,慢到有些无法忍受,
不知道是什么原因,如何解决,请高手指点,谢谢!
(测试条件:数据库、客户端程序、服务端程序 都在同一台机器上)
 
三层结构中如果不对数据进行处理,其速度本来就比CS的慢,要知道三层中,数据毕竟多经过了一个中间层,速度当然比不上C/S.这也并不是三层与二层所比较的地方.
而且兄台并没有了解三层的优势,建议找本书来看看.
 
三层的最大优势在于客户端部署很简单方便,特别适合分布式应用,我目前的项目也是
采用这种结构。以前数据量比较小的时候速度差异不明显,我明白三层结构的速度肯定
要比两层慢一些,可是当数据量达到一定量的时候两者的速度差距太大了,我觉得不应该
有这么大的差距呀?
 
三层中一次性提取上万条数据到客户端也是很常见的,可是提取这些数据要几十秒的时间,
让用户等待这么久总觉得不是很好?对吧。如果在10秒以下还可以忍受,不知道有没有
什么方法提高三层结构的速度?
 
没有,干脆两层好
 
没必要一次性提取那么多数据吧!
就算要的话,也可以分页处理,每次提取少量的,用完再申请呀。
 
我做的是商业系统,基础的商品信息数据就有2万多条,这些数据在客户端的很多模块都用
到,需要一次性提取的。再说,2万条左右的数据也不算多,三层结构却要花20多秒的时
间,而且还是在本机上,然后两层只用2秒多,差距太大了,要是2-3倍的还是可以理解的
,数据量大的时候为什么会差这么多呢?是什么原因导致的?
 
我同意fjjb的意见,再多的数据,我可以分批提取(这在多层里很好处理的),这样用户不必等很久。
另,我理解的三层,是将主要业务放在中间层,客户端只是调用中间层的方法,这样就大大地对客户端瘦身,并且,如果要修改的话,只需要对中间层的一些方法修改,客户端不需要该的,这样对系统维护来说也好多了。浅浅之谈。
 
我是想有没有方法能把三层的效率提高一些,他的瘦客户的优点我也明白,就是因为这个
我才在项目中使用三层结构的。
 
to zag2000,
对大数据量是不能使用简单的查询办法的
你可以把所有数据的唯一值id先得到,根据用户需要显示的记录条数(比如10条),可以通过id去把这十条取过来展现,用户用看后面十个,你就再取十个。
这就是牺牲性能换时间。
 
我觉得就看你客户端要对数据进行怎么样的处理了,如果只是简单地在DBGrid之类的控件中浏览,那完全可以分批取数据,反正取数据都是自动的,不用你操心。
 
跑互联网速度更慢
 
商品信息也无必要一下子SELECT出来吧,难道楼主打算SELECT出来后,在前台作LOOKUP字段显示商品名称,这样的话效率更低得没话说了。
 
to 青出于蓝:
我去出来就是在前台作LOOKUP字段显示商品名称,客户端有很多这种Lookup字段要显示的。
 
那难道你指望一个屏幕一下子显示2万多条记录??肯定是一边拖ScrollBar,一边从数据库取数据嘛
 
从后台SELECT时就应该SELECT出商品名称,然后处理一下数据更新就可以了,使用LOOKUP效率很低。
SELECT A.商品代码, B.商品名称, B.商品规格 FROM 进货单 A, 商品资料 B
WHERE B.商品代码 = A.商品代码
这样做的效率就好得多了。
 
你要改变你的做法,就是做二层C/S用lookup字段显示也不是好方法呀。
在中间层写一个方法,查询数据时只返回少量的数据,不够用时再申请。既然是做多层,就要改变原来的一些习惯性的做法。
 
LOOKUP从本地的ACCESS里读取
2万条记录一次读过来,抽筋啊。读一百条。如果需要更多,就放到后台开线程去下载。搞个进度条。要下载整个数据库都不怕他。
把数据库里的东东形成N个XML文件,一个个下载。2千万条都可以下载下来。
 
我是想知道三层和两层的效率真的能差这么多吗?是不是我的程序有问题,能否优化?
要是速度上在3倍左右还可以,可是数据量达到2万条时相差10倍,这个效率上还是差
很多。不知道各位作三层的时候是不是效率上也差这么多?
 
没有必要一次全部从数据库中将数据提取出,可以使用PackRecord进行限定提取的数量,在客户端进行浏览时再进行数据提取。如果你坚持你的做法用户可能不会忍受的。
 
后退
顶部