Oracle SQL調優記錄


@

一、前言

本博客只記錄工作中的一次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優化》一書


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM