@
一、前言
本博客只記錄工作中的一次oracle sql調優記錄,因為數據量過多導致的查詢緩慢,一方面是因為業務太過繁雜,關聯了太多表。面對復雜的業務場景,確實有些情況是需要關聯很多表的。當然有些情況是可以將業務實現放在Java代碼里,有些情況可以不要關聯很多表。
二、注意點
對於SQL調優,不要馬上就說加索引什么的,加索引不一定就能解決問題的,加錯索引,反而會導致查詢變慢,注意加索引的同時也會影響數據庫寫數據的速度。
三、Oracle執行計划
對於SQL調優,可以通過Oracle的執行計划來分析。oracle的執行計划確實是對sql進行分析的一種很好的方法。
下面介紹一下oracle的執行計划。
oracle要使用執行計划的sql為:
explain plan for select 1 from 表格
不過如果是使用PLSQL的話,那就可以使用PLSQL提供的查詢執行計划了,PLSQL安裝有問題可以參數我以前寫的博客:https://blog.csdn.net/u014427391/article/details/56479085
打開PLSQL
工具 -> 首選項 -> 窗口類型 -> 計划窗口 ,在這里加入執行計划需要的參數
找個SQL,用PLSQL執行一下,這是plsql的簡單使用
解釋一下這些參數的意思:
基數(Rows):Oracle估計的當前步驟的返回結果集行數
字節(Bytes):執行SQL對應步驟返回的字節數
耗費(COST)、CPU耗費:Oracle估計的該步驟的執行耗費和CPU耗費
時間(Time):Oracle估計的執行sql對於步驟需要的時間
表訪問的幾種方法:
TABLE ACCESS FULL(全表掃描)
TABLE ACCESS BY ROWID(通過ROWID的表存取)
TABLE ACCESS BY INDEX SCAN(索引掃描)
...
oracle執行計划其實就是看一下那些表是按索引掃描的,通過加一些索引實現,TABLE ACCESS BY INDEX SCAN(索引掃描)。
下面給出一篇很詳細介紹oracle執行計划的博客
https://www.cnblogs.com/Dreamer-1/p/6076440.html
四、調優記錄
4.1 強制索引
在加一些索引的過程,有時候會遇到索引失效的情況,這時候可以加強制索引試試
強制索引
/*+ index(表名別名 索引名稱)*/
假如select *from 表格 a,然后加了個索引i,那么就是
/*+ index(a i)*/
4.2 基數反饋機制
之前同事有遇到一種加了索引還是不起效的情況,后來聽他說是是一種基數反饋機制導致的,解決方法是在sql加上,意思是關了基數反饋機制
基數反饋機制
/*+ opt_param('_optimizer_use_feedback','false')*/
比如
select /*+ opt_param('_optimizer_use_feedback','false')*/ a from 表格
4.3 oracle開窗函數
用oracle開窗函數替換group by,oracle的group by有時候是很耗查詢的,今天遇到一個sql查詢很慢的問題,用oracle開窗函數進行替換group by提高速度。當然這些都是根據實踐業務場景來調優的。我遇到的業務場景是適合的。因為關聯的表數據量很大。
原來SQL,簡單寫一下,舉個例子,實際的業務場景不是這么簡單的sql
select max(to_number(aa.seq))
from t_info aa
where aa.id = ?
group by aa.seq
改造sql:
select seq from (select aa.seq,
row_number() over(partition by aa.seq order by aa.date desc nulls last)rn
from t_info aa
) where rn=1
然后推薦一本oracle調優書籍《收獲,不止SQL優化》一書