这是表结构:
目前我用了一种低效的方法进行了实现,但是性能真的很低,完成一次30万条的数据统计需要30分钟左右,以下是我的实现:
UPDATE Relaton
SET [ChildNum]=(SELECT COUNT(1) FROM Relaton M WHERE M.[Left] > R.[Left] AND M.[Right] < R.[Right])
FROM Relaton R
有更好的实现方式吗?
这里是统计伞下所有的孩子数目,不能用简单的GROUP BY进行分组统计。
很好解决,我看你现在有个depth,是存放的树的深度吧,那子节点数量也搞一个字段:ChildrenCount,插入新节点删除新节点时就递归更新这个数据,反正depth也是这么更新的吧?不差多一个。
你这样是可以,但我其实是简化了需求,我原本要统计的是每个父下所有孩子的积分,这个积分是变动的,想看一下有没有更好的sql语法
我采用了类似的方案,全部执行完只要10秒不到,先统计下一级的数量,然后上级的等于下一级数量总合
你这是涉及到表的修改才会这么慢,查询不会
查询也是一样的,时间都花在了统计上,不是更新上
SELECT [MemberId], (SELECT COUNT(1)
FROM [Relation] M WHERE
M.[Left] > R.[Left] AND M.[Right] < R.[Right]) AS ChildNum
FROM [Relation] R
我是这样统计的,时间都差不多,更新保用了1秒不到,但统计需要很长时间
where 条件加索引试了么
加了,right和left都有