2022年10月13日 星期四

1. SQL Tuning 簡介

SQL Tuning 一向是資料庫優化的重要課題,一般來說,資料庫效能問題約有 80% 甚或至 90% 是由於 SQL 語句執行緩慢所引起的,對於 Oracle 資料庫來說,效能的調整都會基於 Time Model 來進行,所謂的 Time Model 就是一個公式 :

DB time = DB CPU time + DB wait time


資料庫運行所花費的時間 (DB Time) 等於資料庫消耗 CPU 的時間 (DB CPU Time) 加上資料庫內部等待的時間 (DB Wait Time) ,一個良好的資料庫系統,希望 DB 本身能夠完整的使用到系統的資源,也就是 DB Time 大多為 DB CPU Time 較好,消耗在資料庫本身的等待時間 (DB Wait Time) 越少越好,如果 DB Wait Time 占了絕大多數,那麼就必須檢視 Top 的等待事件,進行 Instance 層級的調整;如果 DB 大部分的時間都已經是使用到系統的資源, DB CPU Time 占了絕大多數,可是資料庫還是有緩慢的情況,這個時候就必須找出 Top SQL 來優化它,進行 SQL Tuning 不僅可以加速執行的速度,也可以減少系統 CPU 的消耗,這也就是本次所要討論的主題。


我們可以遵循下列步驟來進行 SQL Tuning :


  • 確定當前系統的瓶頸

首先須先確認資料庫的瓶頸在於 DB CPU Time 或是 DB Wait Time ,如果在於 DB CPU Time ,此時就可以找出消耗資源最多的 TOP SQL 作為 Tuning 的標的。


  • 測量並記錄當前性能

進行性能的測量是一項重要的工作,所有的 SQL Tuning 必須要有 Base Line 為基準,否則我們不知道 Tuning 的目標在哪裡,例如一句 SQL 跑了 5 分鐘,我們可以說跑 5 分鐘是快、還是慢嗎 ? 答案肯定是不確定的,但如果說有一句 SQL 昨天跑了 1 分鐘,但是今天卻跑了 5 分鐘,那麼當然就可以很肯定地說,它變慢了 ! 因此測量性能是一個很重要的步驟。


  • 設立合理的性能目標

有了 Base Line ,那麼就可以設定 SQL Tuning 的目標,承如上例, SQL 昨天跑了 1 分鐘今天跑 5 分鐘,那麼我們就知道要把這句 SQL 調整回 1 分鐘,為什麼要設定 "合理" 的性能目標 ? 例如一句百行的 SQL 語法,中間使用了多個子查詢,其中不乏還有許多大表的串接,然後要求 DBA 必須調整到 1 秒內回應出結果,這樣子從直覺上就覺得不可能是吧 ? 因此有了 Base Line 我們才能有一個合理的目標。


  • 實施 SQL Tuning

在找出了 SQL 標的以及設定完目標之後,就可以開始來調整 SQL ,對於 Oracle 來說調整 SQL 有四個大方向可以進行調整,檢視統計資訊 (Statistics) 、 調整 Index 、 建立 SQL Profile ,如果上述三招都沒用的話,那麼最後就只能修改 SQL 語句的結構,也就是改寫法。


  • 測量並記錄調整結果,然後停止 Tuning

SQL Tuning 並不是一項無止盡的任務,當 SQL Tuning 的結果達到所設定的目標時,就可以停止 Tuning ,有些長官會不斷的要求 DBA 進行 Tuning ,問題是到底要 Tuning 甚麼 ? 因此設定目標以及完成目標是一項很重要的前置工作。


從上述 Tuning 的流程我們可以發現 Base Line 是一個很關鍵的東西,那麼如何定義這個 Base Line ,我們可以從過去的資訊來當作 Base Line ,首先我們可以使用系統穩定運行的一段區間為主,例如昨日早上 09:00 ~ 12:00 是系統穩定正常運行的區間,那麼就可以使用昨日的 09:00 ~ 12:00 當作 Base Line 區間;或者是同樣時段的穩定區間,例如今日週三 14:00 發生效能問題,而上週三 14:00 效能是正常的,那麼就可以使用上週三 14:00 的區間當作 Base Line 。在找出 Base Line 的區間後,接下就可以利用這區間的數據來做 Base Line ,數據來源可以是 AWR Report 、 撈取 dba_hist_sqlstat 的資訊,或者是使用官方所提供的 SQLHC 這項工具都可以找到足以作為 Tuning 的 Base Line 。


在了解 SQL Tuning 的本質與概念後,接下來就可以真正來做 SQL Tuning 了。

沒有留言:

張貼留言