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

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章