Oracle大數據量分區後查詢效率低下

場景描述:


  Oracle數據庫中有2張表,一張是tm_bus_realtime_log當前表 只有當前一天的數據。數據量有幾百萬的數據。還有一張表,tm_bus_realtime_his歷史表 進行了分區。每10天一分區,就是每個月有3個分區。整個歷史表有幾億的數據量。每個分區有千萬條數據。

wKioL1PVuyChNVviAAFINNJxVi4067.jpg

問題描述:


  在從歷史表的分區中,查詢數據時,很慢,由於數據量非常大,如果想查詢幾天的數據更慢?應該如何提高查詢的速度?


在論壇上發了一個關於這方面的一個帖子,非常感謝留下意見的人,一些好的建議如下:


1 改成一天一個分區


2 對歷史數據 進行清理,比如只保存2年的數據


3 依據計劃看看索引建的合適不


4 如果你的查詢條件中,除了時間,如果還有其他的字段,那就要相應的建上本地索引


5 如果歷史表數據不更改的話,可以考慮在時間字段建立一個trunc(XX)位圖函數索引,查詢的時候再指定分區。


6 表分區、那索引分區


7 依據where條件而定。


我的一些做法:


其實就是想做兩個界面,把需要的一些綜合信息查詢出來進行展示,這些信息數據量很大。進行了分區。但是查詢出來顯示的時候,當天一天的數據還可以,但是一但垮天,跨分區之後,就查詢的速度特別的慢。


1 對於當前表tm_bus_realtime_log。查看它的索引,只有一個(索引名:INDEX_BUS_REALTIME 字段名:UPLOAD_TIME)


而我的查詢SQL裏面的條件裏面有2個字段,一個是bus_no,一個是upload_tiime,應該把索引字段緊跟到where條件後。


2 對於查詢出來的數據,不要使用*,最好是具體的字段。


3 在plsql裏面按F5,對該SQL語句,看一下它的執行計劃,看是進行的全表掃描,還是走的索引。


4 索引不適合建立很多,多了,也會影響查詢效率。當時就把其中一個沒用的多餘的索引刪除了。速度也就快了。


5 儘量不要使用in。使用exists.


6 優化代碼。


現在查詢出來的數據快多了!


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