+ -
当前位置:首页 → 问答吧 → 简单的一句代码 ,花了1秒,如何优化?

简单的一句代码 ,花了1秒,如何优化?

时间:2011-12-05

来源:互联网

SQL code

SELECT 
    a.OUID,
    a.OUName,
    a.OULevel,
    a.OUFullName,
    a.ParentOUID
    ,(SELECT COUNT(1) FROM tbEmployeeInfo tei 
     WHERE 
        (a.OULevel> 2 AND tei.OUIDs LIKE a.OUID+'%')
        or (a.OULevel< 3 AND tei.DeptOUIDs = a.OUID)
    ) AS 人员总数
FROM tbOrganization a
WHERE  a.OULevel< 4
ORDER BY OULevel



就是统计每个部门有多少人

作者: leongF   发布时间: 2011-12-05

如果把下面的代码去掉就很快
SQL code

,(SELECT COUNT(1) FROM tbEmployeeInfo tei 
     WHERE 
        (a.OULevel> 2 AND tei.OUIDs LIKE a.OUID+'%')
        or (a.OULevel< 3 AND tei.DeptOUIDs = a.OUID)
    ) AS 人员总数

作者: leongF   发布时间: 2011-12-05

相关子查询里用or和like是很耗时的

作者: ssp2009   发布时间: 2011-12-05

try:
SQL code
SELECT 
    a.OUID,
    a.OUName,
    a.OULevel,
    a.OUFullName,
    a.ParentOUID,
    (SELECT sum(case when a.OULevel> 2 AND OUIDs LIKE a.OUID+'%' or a.OULevel< 3 AND DeptOUIDs = a.OUID then 1 else 0 end)ct
     FROM tbEmployeeInfo
    ) AS 人员总数
FROM tbOrganization a
WHERE  a.OULevel< 4
ORDER BY OULevel

作者: qianjin036a   发布时间: 2011-12-05

OULevel字段上有索引吗?

作者: maco_wang   发布时间: 2011-12-05

有子查询和OR就比较慢了

你可以在 OUID字段加索引。

作者: fredrickhu   发布时间: 2011-12-05

引用 3 楼 qianjin036a 的回复:

try:
SQL code
SELECT
a.OUID,
a.OUName,
a.OULevel,
a.OUFullName,
a.ParentOUID,
(SELECT sum(case when a.OULevel> 2 AND OUIDs LIKE a.OUID+'%' or a.OULevel< 3 AND DeptOUIDs = a……



在包含外部引用的被聚合表达式中指定了多个列。如果被聚合的表达式包含外部引用,那么该外部引用就必须是该表达式中所引用的唯一的一列。

作者: leongF   发布时间: 2011-12-05

引用 4 楼 maco_wang 的回复:

OULevel字段上有索引吗?


特为此建立索引,还是没有效果

作者: leongF   发布时间: 2011-12-05

引用 5 楼 fredrickhu 的回复:

有子查询和OR就比较慢了

你可以在 OUID字段加索引。


还是慢,可能是表前期设计不好,现在没有办法了

作者: leongF   发布时间: 2011-12-05