sql优化的方法及思路_合理的sql优化思路--如何缩短SQL调优时间?
概述
當(dāng)生產(chǎn)環(huán)境發(fā)生故障或者系統(tǒng)特別慢的時(shí)候,這時(shí)候你從awr報(bào)告拿到有問題的sql,但是優(yōu)化的時(shí)候卻優(yōu)化了很久還沒解決,這時(shí)候在領(lǐng)導(dǎo)或者客戶面前就不太好了。。。那么我們?cè)趺慈タs短sql調(diào)優(yōu)的時(shí)間,一般優(yōu)化的思路是怎樣呢?
1、先獲取有助調(diào)優(yōu)的數(shù)據(jù)庫(kù)整體信息
如何縮短 SOL 調(diào)優(yōu)時(shí)間,你的思路是什么呢?下面是當(dāng)我要優(yōu)化 SOL 時(shí)的一般流程:
首先要知道整個(gè)數(shù)據(jù)庫(kù)的運(yùn)行情況,前面我已經(jīng)介紹過數(shù)據(jù)庫(kù) AWR 報(bào)告等調(diào)優(yōu)工具,所以這里就不重復(fù)說明了,因?yàn)?AWR 報(bào)告等是在數(shù)據(jù)庫(kù)出問題時(shí)的利器。可是如果數(shù)據(jù)庫(kù)當(dāng)前沒有 出問題呢?其實(shí)這個(gè)也不一定,很多時(shí)候系統(tǒng)沒問題是因?yàn)槟銢]觸發(fā)這個(gè)問題,其實(shí)是有問題的。
比 如某表的索引失效了,某 SOL 訪問該列時(shí)一定只能走全表掃描;比如某表的屬性被設(shè)置了并行度,這意昧著所有掃描該表的 SOL 都會(huì)并行執(zhí)行,這;可能會(huì)產(chǎn)生嚴(yán)重的資源爭(zhēng)用從而讓系統(tǒng)癱瘓,比如你的全局臨時(shí)表被收集了統(tǒng)計(jì)信息,訪問該表的 SOL 就可能會(huì)出現(xiàn)錯(cuò)誤的執(zhí)行計(jì)劃等等。不過你的 AWR 報(bào)告卻可能發(fā)現(xiàn)不了這些問題,比如該時(shí)段和這些對(duì)象相關(guān)聯(lián)的 SOL 根本 就沒有執(zhí)行。沒發(fā)現(xiàn)問題并不代表沒有問題,因此我們需要獲取所有可能有問題的對(duì)象,同時(shí)也需要獲取所有的相關(guān)時(shí)段的 AWR 等數(shù)據(jù)庫(kù)整體性能報(bào)告,獲取數(shù)據(jù)庫(kù)的整體信息。這里可以考慮用腳本去一鍵獲取,這樣就可以提高效率了。
2、快速獲取 SQL 運(yùn)行信息
接下來,在獲取到數(shù)據(jù)庫(kù)整體信息后,調(diào)優(yōu)的方向就非常明確了,對(duì)具體的 SOL 進(jìn)行調(diào)優(yōu)。執(zhí)行計(jì)劃是 SOL 調(diào)優(yōu)的重要武器,通過分析 SOL 計(jì)劃,我們可以判斷 SOL 的訪問路徑是否 高效,從而進(jìn)行調(diào)整優(yōu)化。關(guān)于執(zhí)行計(jì)劃的獲取手段有 6 種之多,這是為啥呢?各有啥區(qū)別 呢?這部分內(nèi)容也是在前兩天都做了介紹的,大家可以自己再看看。
還需要將執(zhí)行計(jì)劃和運(yùn)行時(shí)的統(tǒng)計(jì)信息結(jié)合在一起分析,這樣才會(huì)更準(zhǔn)確。比如 SOL 產(chǎn)生 了多少邏輯讀,多少物理讀,是否有排序,是否有遞歸調(diào)用 , 等等。
3、快速拿到 SQL 關(guān)聯(lián)的信息
當(dāng)獲取到 SOL 的執(zhí)行計(jì)劃l后,很多都和該 SOL 對(duì)應(yīng)的表和索引有關(guān)。比如當(dāng)我們懷疑驅(qū)動(dòng)表的順序有錯(cuò)時(shí),我們就會(huì)去看看這些表的實(shí)際大小和對(duì)應(yīng)的統(tǒng)計(jì)信息是否準(zhǔn)確;我們也關(guān)心表的類型是什么,比如是否是分區(qū)表,在哪個(gè)列有分區(qū),分區(qū)的類型是什么,等等。
除了關(guān)注表的信息,我們也很關(guān)心索引的信息。比如看到執(zhí)行計(jì)劃中非常適合走索引的查詢走了全表掃描,我們就會(huì)去看看是否該列無索引,如果發(fā)現(xiàn)有,就看看此列索引是否失效 了。一般我們也會(huì)關(guān)心索引的類型是什么,是 Btree 索引還是位圖索引還是函數(shù)索引;是單列索引還是組合索引,如果是組合索引,哪列在前,如果索引建在分區(qū)表上,我們還關(guān)心是全局索引還是局部索引,等等。
這里也可以用腳本將該 SOL 涉及的所有表和列的相關(guān)信息直接展現(xiàn)在我們面前,這樣,解決問題就非常高效了。
篇幅有限,今天主要分享下sql優(yōu)化的整體思路,相關(guān)腳本抽空再單獨(dú)介紹下~
后面會(huì)分享更多關(guān)于DBA方面內(nèi)容,感興趣的朋友可以關(guān)注下!
總結(jié)
以上是生活随笔為你收集整理的sql优化的方法及思路_合理的sql优化思路--如何缩短SQL调优时间?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 根据条件查询某条记录的条数_「性能与架构
- 下一篇: python保存代码需要删除头部信息吗_