SELECT COUNT(*) MUCount,COUNT(DISTINCT USERID) SMCount
FROM Userchange u
WHERE exists (SELECT *
FROM manageunit m
WHERE u.Machineid=m.TO_NUMBER(DEPNAME)
delsign = 0 AND ismachineid=1
CONNECT BY PRIOR managerid=parent
START WITH parent=id);加索引,然后测试。
FROM Userchange u
WHERE exists (SELECT *
FROM manageunit m
WHERE u.Machineid=m.TO_NUMBER(DEPNAME)
delsign = 0 AND ismachineid=1
CONNECT BY PRIOR managerid=parent
START WITH parent=id);加索引,然后测试。
非常感谢,但是还是不行,一样满!
怎么办呀?
比如节点
A1(id=1 )
A11(id=2 )
1(id=3 )
2(id=4 )
A12(id=5)
3(id=6)
4(id=7)
B1(id=8 )
B11(id=9)
5(id=10)
6(id=11)
子查询 中的id=8得到结果为10、11, 子查询中id=1得到结果1、2、3、4
流水表中的Machineid就记载了1、2、3、4....节点。
SELECT COUNT(*) MUCount,COUNT(DISTINCT USERID) SMCount
FROM Userchange
WHERE Machineid IN (SELECT TO_NUMBER(DEPNAME)
FROM manageunit
WHERE delsign = 0 AND ismachineid=1
CONNECT BY PRIOR managerid=parent
START WITH parent=id);
优化方案:
SELECT COUNT(userid) MUCount,COUNT(DISTINCT USERID) SMCount
FROM (select a.USERID from Userchange a,
(SELECT TO_NUMBER(DEPNAME) uid FROM manageunit
WHERE delsign = 0 AND ismachineid=1
CONNECT BY PRIOR managerid=parent
START WITH parent=id) b
where b.uid = a.userid) new_view;优化思路:
1、在不知道列表数量时尽量不要用无关子查询in(in后面的列表数量不能超过1000,否则oracle出错)。
2、使用相等关联把条件限制的结果放到视图(new_view)里,再通过视图得到统计结果。
3、从表中取列尽量只用到索引列(关键是where后面用于比较的列),没有索引的建议加。
(例如表manageunit中 delsign 和 ismachineid 建成一个索引(and连接的合起来建,or连接的分开建),managerid 和 parent 建成一个索引)
太感谢了,我觉得思路特别好。
我先试试!
谢谢你的方法,不过速度还不是很快!