您的位置:首页 > 数据库

Sql语句查询优化总结:

2007-02-05 23:59 866 查看
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不同id的building_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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: