Sql语句查询优化总结:

Sql语句查询优化总结:

Date:2007.1.10

t_supervise_job_assign表如下:

id    |    building_id

1     |        101

2     |        101

3     |        102

4     |        103

5     |        103

为了取出(select count(*) from t_supervise_job_assign where  building_id=a.id)同一building_id不同idbuilding_id数量,得到如下的表ct

building_id    |    total

   101                    2

   102                    1

   103                    2

 

下面的查询用了子查询,通过building_id=a.id连外层的表,这样的查询效率超低,甚至查死数据库:

select  distinct a.id,a.building_name,f.record_person ,d.address,d.begin_date,
        (select count(*) from t_supervise_job_assign where  building_id=a.id) status,
        a.create_user 
from    t_building a ,
        t_building_info d,t_monitor_plan e,t_monitor_record f
where   a.id=d.building_id
        AND e.f1_id=a.id
        AND e.stream_id=f.f1_stream_id
        AND a.modify_flag<>'D'
        AND a.building_name like '%
顺德%' order by  status,d.begin_date  desc

 

修改后:

 主要优化这条语句:

select count(*) from t_supervise_job_assign where  building_id=a.id

优化后:

select  t.building_id,count(t.id) as total  from t_supervise_job_assign t group by t.building_id

整合为一个表:

再得到最终优化后的查询语句:

select  distinct a.id,a.building_name,f.record_person ,d.address,d.begin_date,
        ct.status,
        a.create_user 
from    t_building a ,
        (select  t.building_id,count(t.id)  as status from t_supervise_job_assign t group by t.building_id) ct,
        t_building_info d,t_monitor_plan e,t_monitor_record f
where  a.id=d.building_id
       AND e.f1_id=a.id
       AND ct.building_id(+)=a.id
       AND e.stream_id=f.f1_stream_id
       AND a.modify_flag<>'D'
       AND a.building_name like '%
顺德%' order by  status,d.begin_date  desc

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值