1. 程式人生 > >oracle優化-----統計排序效率

oracle優化-----統計排序效率



 先說明下業務查詢主要欄位(id,org_code,org_name,org_count其中org_count為計算統計出的數量)按數量前10條倒序排列首先考慮到用分頁輸出來控制效率

先貼上語句

SELECT t.ID,t.ORG_CODE,t.ORG_NAME,t.ORG_COUNT from
(SELECT ROWNUM RN ,A.ID,A.ORG_CODE,A.ORG_NAME,A.ORG_COUNT FROM
(SELECT c.ID,c.ORG_CODE,c.ORG_NAME,
(SELECT count(ID) from llt_report b where b.SEND_ORG_ID=c.ID) as ORG_COUNT from Llt_Org_Info c order by ORG_COUNT desc)
 A WHERE ROWNUM <=10) t WHERE RN >0

因為oracle 中不支援top 關鍵字,分頁只能靠rownum 來控制條數來顯示,但最內層查詢時已經把所有結果都掃描一遍

SELECT c.ID,c.ORG_CODE,c.ORG_NAME,
(SELECT count(ID) from llt_report b where b.SEND_ORG_ID=c.ID) as ORG_COUNT from Llt_Org_Info c order by ORG_COUNT desc

在用分頁控制時就是對所有查詢結果分頁 並沒有只查10條然後對這10條排序(也就是說分頁並沒有起到主要作用)

如果在查詢中用ROWNUM 控制住條數但結果又不對
SELECT c.ID,c.ORG_CODE,c.ORG_NAME,
(SELECT count(ID) from llt_report b where b.SEND_ORG_ID=c.ID) as ORG_COUNT from Llt_Org_Info c

where rownum<=10 order by ORG_COUNT desc

經過反覆測試發現問題主要集中在order by 排序後效率明顯下降(說明查詢時oracle先對錶統一查詢一遍然後又排序重執行一遍)!!(但排序必須保留)

首先oracle中感覺分頁太繁瑣,不斷對層層結果集程序操作,頻繁使用select查詢 增加對錶的操作次數降低了查詢效率

10條查詢耗時約1.4秒

那麼Oracle中如何操作統計的欄位排序

優化的幾點建議:

1健壯的sql不要依賴資料進行條件過濾,要根據表的初衷設計來進行過濾條件

2要選好基礎表,(基礎表標準:資訊涵蓋全,資料量儘可能小 好比雪花型設計中的中心)

現在考慮直接篩選出所需欄位,組成結果集

--優化後
select t.send_org_id,
(select a.org_code from llt_org_info a where a.id=t.send_org_id) as org_code,
(select a.org_name from llt_org_info a where a.id=t.send_org_id) as org_name,
count(t.send_org_id) as count_send_org_id                  ----統計數量的欄位

from llt_report t
where t.send_org_id in (select id from llt_org_info)       --過濾非所需資訊
group by t.send_org_id order by count_send_org_id desc

 耗時大約0.09秒

效率有了質的改變

總結:oracle中排序不建議用oracle中提供的ROWNUM分頁,因為ROWNUM只能對查詢的所有結果在過濾,並沒在查詢中控制數量 ,建議直接篩選欄位排序不僅減少了SELECT的頻繁使用,也使語句結果更加明朗!