最近做一個統計分析相關的功能,需求是分析統計出某一個時間段(時間段不定,比如2017-03-20 08:00~2017-03-27 08:00)出租車的前十的起點小區總發車數,還有統計出這十個小區分別發往各個地方的前9的發車數。
問題點:現查詢統計一個星期的資料(約55w)時間在18s左右,回應時間太長。
現排查到的原因是資料量較大進行多次分組排序導致查詢太慢,個人剛入門菜鳥一個,感覺sql陳述句沒辦法在進行優化。
所以想請教一下各位有沒有好一點的解決方案,控制在5s內回應。sql優化或者其他實作方案。
采用oracle資料庫,主表TSRT_TAXI_hourdemand 表結構如下,資料量約6千萬,每日增長約8w,TIME有索引

從表TSRT_TAXI_TRAFFICZONE ,結構如下,資料300多

采用分組查詢,sql如下,
with t as
(select *
from (select a.*, b.AREA_ID SGRID_ZONE, c.AREA_ID EGRID_ZONE
from (select a.*,
CASE
WHEN TO_CHAR(a.TIME, 'HH24:MI') BETWEEN '08:00' and
'10:00' THEN
1
WHEN TO_CHAR(a.TIME, 'HH24:MI') BETWEEN '17:00' and
'20:00' THEN
2
ELSE
0
END as unit
from TSRT_TAXI_hourdemand a
where a.TIME >=
to_date('2017-03-26 00', 'yyyy-mm-dd HH24:mi')
and a.TIME <=
to_date('2017-03-27 23', 'yyyy-mm-dd HH24:mi')) a
left join TSRT_TAXI_TRAFFICZONE b
on b.GRID_ID = a.SGRID_ID
left join TSRT_TAXI_TRAFFICZONE c
on c.GRID_ID = a.EGRID_ID)
WHERE SGRID_ZONE IS NOT NULL
AND EGRID_ZONE IS NOT NULL
AND SGRID_ZONE != EGRID_ZONE
)
select b.AREA_NAME SGRID_NAME,
b.LONGITUDE SGRID_LON,
b.LATITUDE SGRID_LAT,
c.AREA_NAME EGRID_NAME,
c.LONGITUDE EGRID_LON,
c.LATITUDE EGRID_LAT,
FLOW_NO,
rn
from (select b.SGRID_ZONE, b.EGRID_ZONE, b.FLOW_NO, b.rn as rn
from (select a.*,
row_number() over(partition by a.SGRID_ZONE order by a.FLOW_NO DESC) rn
from (select t.SGRID_ZONE,
t.EGRID_ZONE,
sum(t.FLOW_NO) as FLOW_NO
from t
where t.SGRID_ZONE in
(select b.SGRID_ZONE
from (SELECT t.SGRID_ZONE, SUM(T.FLOW_NO)
FROM t
group by SGRID_ZONE
ORDER BY SUM(T.FLOW_NO) DESC) b
where ROWNUM <= 10)
group by t.SGRID_ZONE, t.EGRID_ZONE) a) b
where b.rn < 10) a
left join ttcb_trans_area b
on b.ID = a.SGRID_ZONE
left join ttcb_trans_area c
on c.ID = a.EGRID_ZONE;
uj5u.com熱心網友回復:
資料量約6千萬,每日增長約8w,TIME有索引資料量不算小了,建議在 TIME 做時間磁區,每天一個磁區,并建立相應的磁區索引;
uj5u.com熱心網友回復:
在分組排序那里建一個物化視圖試試uj5u.com熱心網友回復:
這個方案不行啊,建了磁區,磁區索引,沒有之前普通索引快。
針對結果集分組排序,結果集查詢日期不定,好像沒辦法建物化視圖
uj5u.com熱心網友回復:
where 條件,用到磁區列了嗎?
uj5u.com熱心網友回復:
指的是這個where條件嗎?
where t.SGRID_ZONE in...
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/99298.html
標籤:開發
