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

  • 主题发起人 主题发起人 zag2000
  • 开始时间 开始时间
我觉得读数据没必要用三层,你用LOCKUP字段可能是因为好在DBGRID中直接删除记录,而不会影响关联表,不用写SQL来删除记录再重新开关表,各有好处
三层提取数据就是比两层慢,差异如你说的那样,反正不管理二层还是三层,一次取个大几万条记录,都快不到哪,关键是想办法不要让SELECT *fROM TABLE WHERE出来几万的数据
 
三层和两层主要的速度瓶颈在于:三层MIDAS对数据的处理(封包和解包)的效率。
从速度的巨大差异来看,我觉得可能是midas对数据处理的效率不是很高,哪位知道
midas对数据处理效率的官方数据?提供一份做个参考。谢谢。
 
千万不可在多层中用没有条件的SELECT语句从有万条以上的表中取数用作LOOKUP源。
如果你一定要用LOOKUP去从SERVER上取20000条以上的基础数据,建议你在客户端也放一个
ACCESS之类的DB,然后用每次登录系统时从SERVER下载新的数据追加到客户端的ACCESS表中,LOOKUP时用客户端本地的ACCESS表,这样会好好多。
为了不使用户抱怨登录时因下载基础数据慢,你可以做个“下载基础数据”的功能,让用户在空闲时间下载。
 
几万的资料可以放在系统开启时用分布式的方式取数
 
我感觉三层速度慢主要在:服务器端对数据的打包过程和客户端对获取的数据解包的过程。
数据的打包和解包是由MIDAS自身处理的,无法具体修改。
 
关注。。
好像还没有更好的办法。。。
 
要多看李维的书,
数据在1000以下,三层比两层慢不了多少,多于1000条速度会越来越慢,所以对大数据量的处理,要分段读取。
 
问题: 三层结构为何这么慢!有何方法加快一点? ( 积分: 200 )
分类: MIDAS / DCOM

来自: yifawu1, 时间: 2001-02-04 20:40:10, ID: 448787
三层太慢了!
我把 sql server 的 一个表加到 10000 条记录时,
打开表就用了20秒钟。
改了 packet 参数也是如此

来自: 笑傲江湖, 时间: 2001-02-04 20:47:01, ID: 448793
先在你的应用服务器上(两层)测试一下打开该表的时间,看看时间瓶径到底发生在那一步了.

来自: yifawu1, 时间: 2001-02-04 20:51:10, ID: 448794
两层打开时不到一秒

来自: yifawu1, 时间: 2001-02-04 20:55:06, ID: 448795
是否三层结构不适合于大的数据库.
我采用socket 连接方式。采用单机测试.

来自: 笑傲江湖, 时间: 2001-02-04 20:57:08, ID: 448797
应用服务器先启动了吗?
还是客户端运行时自激活的?

来自: yifawu1, 时间: 2001-02-04 21:01:28, ID: 448799
中间层基本上采用默认值。

来自: 笑傲江湖, 时间: 2001-02-04 21:04:56, ID: 448801
我的意思是,你有没有先把应用服务器启动起来,然后运行客户端程序.
而不是等客户端程序运行时自激活应用服务器.

来自: yifawu1, 时间: 2001-02-04 21:06:08, ID: 448803
两者试过没有什么区别
服务器并没有试先打开数据
客户端临时调用数据,上传SQL语句给服务器,再返回数据

来自: 笑傲江湖, 时间: 2001-02-04 21:13:25, ID: 448805
你的应用服务器上的DATABASE连接是什么时候干的?

来自: yifawu1, 时间: 2001-02-04 21:16:50, ID: 448810
采用ADOconction,没有用到BDE,也没有采用 database 组件.

来自: 笑傲江湖, 时间: 2001-02-04 21:24:27, ID: 448816
你的应用服务器上的ADOconction连接是什么时候干的?

来自: 左轻侯, 时间: 2001-02-04 21:26:24, ID: 448818
1、网络速度怎么样?
2、ado控件的属性是否设置正确

来自: yifawu1, 时间: 2001-02-04 21:30:44, ID: 448824
应用服务器上的ADOconction连接是在启动时就连好了
现在在服务器上事先打开表,
客户端直接连上(不传SQL语句)
若设packet 值为-1时,客户端打开仍要10秒.

来自: yifawu1, 时间: 2001-02-04 21:36:57, ID: 448826
ado控件的属性不知如何设才为正确,
与两层有何不同?

来自: 笑傲江湖, 时间: 2001-02-04 21:37:37, ID: 448827
做下两个测试:
1.改用DCOM连接试验一下.
2.改应用服务层换成TDATABASE/TQUERY试一下,我知道这不是你要的,测试一下看看问题到底在哪?

来自: yifawu1, 时间: 2001-02-04 21:45:26, ID: 448832
现在将packet 设为20, 打开还是很快,但是我必须访问所有记录
因为这个表是所有的库存物品,都可能用到.

来自: 笑傲江湖, 时间: 2001-02-04 21:49:21, ID: 448833
你PACKET不是搞过说不行吗:(

来自: yifawu1, 时间: 2001-02-04 22:09:19, ID: 448854
我是说现在设packet=20是快了,但是设为-1 就非得10 多秒
难到在程序进入时打开所有的大表吗?

来自: yifawu1, 时间: 2001-02-04 22:26:56, ID: 448861
难到为了使用三层结构就得让用户去多等10 多秒钟表吗?

来自: 房客, 时间: 2001-02-05 0:35:35, ID: 448947
关注此题

来自: Seoul_BJ, 时间: 2001-02-05 0:49:27, ID: 448955
老兄
  拜托,无论什么时候也也不可能同时使用一个表中的所有数据啊,带有计算等问题的
可以放在应用服务器上完成,我算是服了你了。

来自: 季晓峰, 时间: 2001-02-05 13:00:49, ID: 449283
看看李维的书,应该对你有所帮助

来自: hclee, 时间: 2001-02-05 17:06:51, ID: 449446
楼上说的没错,用户是没法一次性看那么多记录的。

来自: VGA, 时间: 2001-02-05 18:02:29, ID: 449500
在进行统计汇总时。

来自: 陀螺, 时间: 2001-02-05 20:32:15, ID: 449606
查表工作应尽可能在服务器完成。

来自: yifawu1, 时间: 2001-02-05 21:36:55, ID: 449661
请你试试,虽然我可以设packet为20 ,打开时很快,
但是我用append 命令追加记录时,发现客户端还是要
返回库中的所有记录除非不用 append命令.
刚卖李维的书,照他的方法查询一条记录要 0.5秒左右,
可是用户要反复查询时,还不如把记录全部读进内存
因为这样只要 0.0几秒的样子

来自: 鱼片干子, 时间: 2001-02-08 10:46:56, ID: 451627
但是数据是有可能被别的用户改变的,如果读入内存,如何保证数据是一致的?

来自: rixin, 时间: 2001-02-08 11:33:01, ID: 451695
把表加幾個索引試一下.

来自: oooo, 时间: 2001-02-08 11:50:55, ID: 451718
三层结构和两层结构的区别主要在中间层,原先在client层的任务现在大部分放到
服务器层来完成,因此如果把两层改成三层,而任务仍然大多在client端完成的话
,这样反而容易造成性能的瓶颈,应该充分利用middle的缓存作用,把大部分任务
交给middle来完成,这才是设计三层结构的目的所在。

来自: qiu_peking, 时间: 2001-03-13 19:11:23, ID: 469731
不要一次把记录的所有字段都取过来,可以先只取关键字段。用户浏览到一条记录时再
将该记录完整取过来。这是解决该问题的唯一办法。
另外,检查一下你是否真的需要用户看到所有记录,SELECT语句应尽量加上限制条件。

来自: wjiachun, 时间: 2001-03-19 9:58:14, ID: 473224
多人接受答案了。

得分大富翁: hclee-20,oooo-20,qiu_peking-20,rixin-20,Seoul_BJ-20,季晓峰-20,陀螺-20,笑傲江湖-20,鱼片干子-20,左轻侯-20,
 
问题: 三层结构的效率问题,还没满意答复!!一个主表对十几个从表,如何提高三层结构运行效率,欢迎高手发表意见 ( 积分: 150 )
分类: MIDAS / DCOM

来自: sunrainwang, 时间: 2003-01-16 21:11:00, ID: 1584908
我有一个基本信息输入界面,里边有一个主表,对应十几个从表,考虑到用户输入信息方便性我用了一个TPageControl控件,
上面有十几个Tabsheet,主表的记录大概有3000多条,我每次取30条,从表有个主表的图形信息界面,比较耗内存和占较大的
传输负荷;我尝试了一下几种做法,效率都不是很理想,请高手指点:
1.先打开主表和其中第一个显示的从表,然后在点击每个Tabsheet的时候打开对应的数据集,但有明显的停顿;用户肯定不舒服
2.在客户端设置主从关系,在窗体打开的时候一次性打开所有的数据集,但速度很慢,数据量大的时候十几秒甚至几十秒,……
3.在中间层设置主从关系,用巢式数据结构把所有的从表依附在主表中,客户端一次性打开主表,也很慢,十几秒……
4.最后,我没辙了,打算用一个个弹出式窗体替代Tabsheet,这样问题肯定可以解决,但用户说还是用Tabsheet方便,……
为了提高运行效率,请问有什么更好的方法吗?或者如果有三层结构设计效率方面的经验也可以发表意见,分不够可以再加!

来自: 52free, 时间: 2003-01-16 21:15:00, ID: 1584914
给它个等待窗体看看
DELPHI6不也是这么对我们的嘛,不过你可以把窗体做得生动一点
(歪点子)

来自: sunrainwang, 时间: 2003-01-16 21:25:00, ID: 1584932
我使用的是进度条,但是,有进度条也要等十几秒甚至几十秒也不是好滋味哦,谢谢!

来自: jeff86, 时间: 2003-01-17 16:57:00, ID: 1586681
你的系统是要在internet上用吗?如果是的话,你的资料又多還有圖檔﹐是必然有延遲的﹗
如果可以在每個使用的客戶端局域網中都建立一個相同結構的資料庫﹐就不會有明顯的延遲了﹗
剩下的問題就是資料庫同步的問題了﹖

来自: sunrainwang, 时间: 2003-01-17 17:15:00, ID: 1586748
internet上的B/S结构只是其中一部分,主要功能还是图形界面的形式;

来自: Traveller, 时间: 2003-01-17 18:44:00, ID: 1586926
当TabSheet被Show出来的时候加载它对应的数据。

来自: sunrainwang, 时间: 2003-01-17 19:22:00, ID: 1586986
但有明显的停顿;

来自: ysiwei, 时间: 2003-01-18 13:11:00, ID: 1587751
解除主从关系,在TabSheet切换时利用主表的当前记录人工控制子表数据的加载,
减少数据传送量,在子数据加载时采用无序状态(不使用ClientDataSet的PageCount属性,
手工提取数据),同时把界面显示与数据提取利用线程分开;

来自: qiubole, 时间: 2003-01-18 13:14:00, ID: 1587753
一个主表对应十几个从表,
感觉你数据库设计的有问题。
在1..N的关系设计中,应该体现的是N..1的关系,而不是1..N
两者关系感觉是一样的,但体现给最终用户是不一样的。
另外在你所使用的操作中,将主从关系允许用户交互更改,这一点使得你的程序设计的复杂。
如果将它们在用户的操作上进行分离,应该不会那么复杂了。

来自: sunrainwang, 时间: 2003-01-18 20:23:00, ID: 1588348
to qiubole:
数据库设计的建议能不能解释清楚一点?对操作分离我考虑过,但我的项目是用户“实时监控”,有些东西它说了算。
否则项目不给你了结,也是很痛苦的。

来自: Traveller, 时间: 2003-01-19 16:19:00, ID: 1589144
你们这样的项目组织方式有问题!这样的合同不能签,否则只能费力不讨好!

来自: sunrainwang, 时间: 2003-01-19 19:26:00, ID: 1589383
如果我是老板,我……
依目前的情况还是签,公司刚起步,十几二十几万的项目姑且不说赢利,但可以稳住阵脚了……
以后如果真的搞大了,我就不做这样的东西了,唉,反正现实的东西很难说得清楚。谢谢!

来自: Traveller, 时间: 2003-01-19 20:11:00, ID: 1589429
我的意思是你们应该和客户商定一个需求并且签订合同,否则这个项目会成为你们公司的人力资源黑洞。这样无论对于你们还是对于客户都不是好事。

来自: sunrainwang, 时间: 2003-01-21 21:04:00, ID: 1591858
现在不能讨论这个问题了,关键是怎么帮我解决这个难题,谢谢!

来自: Traveller, 时间: 2003-01-22 9:59:00, ID: 1592500
首先,一定要在客户端设置主从关系,因为如果在服务器端设置主从关系,那么速度要比客户端低不少(我也不清楚为什么)
其次,尽可能通过设置SQL条件使主表的记录少一些。
最后,采用“用户操作哪个子表就临时打开哪个子表的方式”这样虽然会有些延迟,但是总比全都调入,却只使用到其中的一个强啊。。

来自: tanglu, 时间: 2003-01-22 12:44:00, ID: 1593074
可以考虑再减少一些数据下载量,例如每次打开的从表都是经过一些条件过滤的。
还有,可以考虑使用Cache机制,这样不用每次都下载已经下载过的数据。

来自: liuxudong, 时间: 2003-01-22 16:37:00, ID: 1593730
主表记录3000条不算多
建议更改数据库设计,把从表分割成多个从表,减少从表记录,这样从表打开就不会慢了。

来自: sunrainwang, 时间: 2003-01-22 16:56:00, ID: 1593770
因为各个从表的表示意义不同而且对应关系不完全一致,合并不是很妥当.
现在我测试的结果发现:只有打开大量的某从表数据的(如上万条)和三维空视图时浏览速度明显
感觉到慢.所以我现在的做法是把三维空视图处理独立出来,改为带参数形式减缩数据传送压力
效果稍有改观,但并非完美!
我的数据库:Oracle
使用的是BDE连接.

来自: sunrainwang, 时间: 2003-02-17 13:46:00, ID: 1626728
我在客户端设置主从关系,据DELPHI开发人员指南介绍TClientDataSet.PacketRecords设置为0
并建议千万不要改动,我试验了一下,有好多表数据没下载,有谁知道PacketRecords的有关用法吗?

来自: wnllt, 时间: 2003-02-17 22:49:00, ID: 1628064
首先:
谢谢你回答我的问题
你所说的问题我去年做过一个三层结构的查询系统,我在客户端用的笨方法是 Frame
在每个Frame.FrameConstrainedResize 初始化数据。
你通过这个效果可以满足你的客户需求。达到Tabsheet的效果!不知道可不可行。

来自: internet_plus, 时间: 2003-02-21 14:35:00, ID: 1636298
是不是从表的纪录太多了?
如果是,可以考虑这样的方案:
OnFormCreate:
Doload 前30条主表纪录
OnMasterTableScroll:
用动态查询获取从表纪录

来自: 阿艺, 时间: 2003-02-21 14:36:00, ID: 1636306
这里有好东东请自已看吧
http://lui2008.8u8.com

来自: Gusn, 时间: 2003-03-12 10:57:00, ID: 1674601
我觉得有一点你必须清楚知道一个主表对应十几子表在打开的速度上肯定会有点慢,而且也
要让客户知道这一点,再就是我认为不要一下子同时打开这么多表,可以在进入程序时先打
开主表,例如用DBGirt来显示主表记录,当选中某记录后,并切换到某个TabSheet时才打开
相应的子表,这样我想速度并不会很慢

来自: dragonx23, 时间: 2003-03-12 11:06:00, ID: 1674649
同意Gusn的做法

来自: admintty, 时间: 2003-03-12 18:17:00, ID: 1676377
试验一下DBExpress,中间层主从表,客户端PacketRecord设置为一大于0但又不太大的值。
BDE是桌面型的数据引擎,效率不如DbExpress。
李维有一本书是讲Dbexpress编程的,我觉的值得看看。

来自: sunrainwang, 时间: 2003-03-13 10:26:00, ID: 1677610
xx

来自: ndch, 时间: 2003-03-18 20:56:00, ID: 1692636
可不可以设一下fetchdetails属性,在用户打开哪一个tabsheet的时候,你再fetch details
一下,这样应该要快很多。

来自: sunrainwang, 时间: 2003-03-19 10:32:00, ID: 1693699
算了,很久了,散分!

来自: sunrainwang, 时间: 2003-03-21 12:07:00, ID: 1700068
多人接受答案了。

得分大富翁: 52free-10,admintty-10,dragonx23-10,Gusn-10,internet_plus-10,jeff86-10,liuxudong-10,ndch-10,qiubole-10,tanglu-10,Traveller-20,wnllt-10,ysiwei-10,阿艺-10,
 
后退
顶部