旧问题,如何做一棵极速的与数据库相联! ( 积分: 200 )

  • 主题发起人 主题发起人 LJH1978
  • 开始时间 开始时间
L

LJH1978

Unregistered / Unconfirmed
GUEST, unregistred user!
我要加载一个数据表(全国地区代码3300条数据) 到TREE中
我试了两个方案
一是用普通TREE,通过递归实现,费时5-6秒
二是通过DXDBTREELIST,直接设置ID,PID相关联,费时1.5秒左右。
结果还是不尽我意
我看到一些软件,用普通的TREE控件,有近万个数据,一次载入不到0.5秒,不知是如何做到的,有什么好的算法或控件,谢谢!
 
没弄过那么多条的数据,不过上千条数据用5-6秒已经足够快的了!

帮顶 并 关注.................
 
希望的效果是
1万条数据<0.5秒 !
 
是一次性全部加载?
还是上来只加载了第一层, 等需要时再读入下一层
 
一次性加载,谢谢!
 
我曾经做过一个有20万数据的Tree.在用户看来载入一点延时也没有.
其实是分层载入的.先只载入第一层给用户看.
当他展开某个节点的时候
如果该节点的子节点加载过,才加载该节点的子节点数据
被展开的节点的子节点都加载过,就不理
 
to wr960204,谢谢你指导
只加载第一层的话,如果一个节点下没子节点,前面也是有个+号

另外我以前看到一个叫HRP5.0的程序(华军软件园上有下),他的数据也是三四千条的,但
载入时没什么延时
从感觉上看,应该是一次加载的
 
你说的加号完全可以控制的.嘿嘿
 
树的方法
1 就像微软的资源管理器那样,层层展开
2 在数据库中加个code字段,如001,001001,001002等来反应层次关系,
select * from table order by code
我用cxtreelist比较快,treeview稍慢点
3 a 涉及到数据库的时候,坚决避免用递归
b 在更新树的界面时,加这两句,速度会快很多
TreeView1.Items.BeginUpdate
TreeView1.Items.EndUpdate
 
TreeView1.Items[0].HasChildren := not TreeView1.Items[0].HasChildren;
你给一个加一个节点,执行上面的代码试试.就知道完全是可以控制你所谓节点加号问题了
 
to:wr960204
能否讲讲详细办法,你的QQ是多少?
另外HRP那个软件中,如果是进入EDIT,EDIT中的值会在TREE中定位显示出来

四川省
成都市
成都市一区
成都市二区 (如果EDIT中的值在这里,这儿高亮显示)
............
请问在分层载入的情况下,是如何做到查询定位到子结点的?谢谢



TO lisongmagic
a 涉及到数据库的时候,坚决避免用递归
b 在更新树的界面时,加这两句,速度会快很多
不用递归用什么?谢谢你们
 
不用递归,用循环,呵呵;
我说的不用递归,主要是指不能频繁访问数据库,你要一次性的
读出你所需要的数据,在程序中不能老是访问数据库,如果要是
递归访问数据库,那程序就挂了
 
哦,循环我也用过(ID,PID,NAME)
1/选择出所有表中的数据
2/选择出PID=0的数据,生成根结点
3/选择出PID=根结点ID的数,循环生成子结点
4/再循环生成所有结点
 
我来说两句
1 不要用ID,PID来表示,因为它不能正确地描述一个节点的信息,它只能说明父子关系,
但它不能说明某个节点在某层的index属性,我建议你用一个有规律的code字段来表示
树节点的信息。
2 『2/选择出PID=0的数据,生成根结点
3/选择出PID=根结点ID的数,循环生成子结点』
影响你速度的一个大因素就是你这个循环,因为你这个循环要多次访问数据库,
你是从表中找出父节点是某ID的数据。
我给个建议,你不要从表中读那些id信息,你应当充分利用code的编码规律来
自己生成所有节点的id,你所需要的唯一一个信息就是每层节点的数目。
select sum(id) from table where len(id)=3
union
select sum(id) from table where len(id)=6
union
select sum(id) from table where len(id)=9
...
我的sql不一定是最佳方式,仅提供思路。
利用每层节点的数目自己去生成每个节点的id,
这样就避免的频繁访问数据库的问题。

你可以作个小试验,把所有节点的pid都赋值为0,而不是从
数据库中取,你对比一下速度的差异。
 
『2/选择出PID=0的数据,生成根结点
3/选择出PID=根结点ID的数,循环生成子结点』
这个地方我用的是 adoquery1.Filter,应该影响不是太大,如果层层加载的话,在只展在第一层的情况下,如何定位指定的数值的节点


四川省
成都市
成都市一区
成都市二区 (如果EDIT中的值在这里,这儿高亮显示)
............
请问在分层载入的情况下,是如何做到查询定位到子结点的?谢谢
 
『这个地方我用的是 adoquery1.Filter,应该影响不是太大』
你分析过影响你程序速度的原因了吗,都对比过了吗,你为什么不试试我说的方法呢,
我可不是随便说个方法让你试的,是经过一番思考的
『在只展在第一层的情况下,如何定位指定的数值的节点』
不能定位到子节点,只能定位到离它最近的父节点
 
我下载了一个楼主说的HRP5.5.是VB5或者6写的.
1)首先他的数据查询并不快,点击 领导查询->机构人员信息
弹出一个状态窗口"加载数据请稍后",过了4-5秒钟才出现那个树形界面.
2)其次它是像我上面说的那样分层载入的.而且它的节点所谓"加号"也没处理好.
即使是空节点居然也有加号.
点加号整个树都闪以下(应该是在后台查询子节点,加载子节点), 展开失败,加号才消失.
3)最后它的做法和楼主的需求不太相同.都是点击树右边的Grid才刷新,
而不是根据某个信息定位树的节点.
 
我的计算机不慢,AthlonXP2500+,1GB内存.还要4-5秒.这个软件和楼主说的0.5秒相差太远
 
to wr960204
请在机构录入或人员录入中试试地区代码的录入,有三千多条数据
TO lisongmagic
因为我的程序中的编码都是是ID,PID,NAME的格式写的,HRP那个也是一样
我想应该有处理的办法,另外感谢你的热心
 
ID,PID,NAME其实也一样,只要这些id值有规律就行了。
树的东西我做过不少,有点心得的,呵呵
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
930
DelphiTeacher的专栏
D
D
回复
0
查看
871
DelphiTeacher的专栏
D
后退
顶部