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