前言
隨著使用者的需求增多及商業模式的日新月異,軟體系統的複雜度日益提高,對於系統程式或資料庫物件中存取關聯式資料庫的指令 - SQL(Structure Query Language) 的執行效能也日亦受到重視。因此,本期IP顧問室請到倍力資訊SQL產品經理謝肇暐,透過Q & A的方式,討論SQL tuning的技術發展,以及如何選擇SQL Tunning的工具,以期達到縮短設計時程以及增進資料庫執行效能的效果。
傳統 SQL 面臨的問題
Q1. 有哪些因素會影響系統執行的效能 ?
答:系統運作的穩定與否,與硬體軟體都有關係,依據經驗,可以從下面幾個因素來考量:
硬體,例如CPU速度、記憶體大小等硬體配備。資料庫系統架構及資料庫設計方式、系統組態設定、網路結構,這包括企業網路的建構方式、頻寬的大小、網路使用的狀況等。
通常我們可以說SQL是關聯式資料庫系統的核心( heart )。 SQL 指令的執行約佔系統資源的70% ~ 90%,若能有效降低 SQL 耗用的資源,對系統整體的執行效率應會有一定程度的提昇。
Q2.傳統上我們如何對SQL指令做tuning ? 傳統方法常面臨哪些問題 ?
答:傳統上,我們在遇到SQL的performance問題時,經常是使用try and error的方式,運用以往的經驗或專業知識,將 source SQL 改寫成幾個執行結果相同的 SQL 指令,再一個一個去測試,並下指令取得各個執行時間及耗用資料庫的成本資訊,也許兩三天後,可將原本的SQL調校成執行效能很好的SQL指令,但卻已經精疲力竭,而且耽擱了其他更重要的事情的進度。
SQL 的特色
Q3. SQL程式語言有何特性,為什麼可以做 tuning?
答: SQL 指令亦屬於程式語言的一種,但是其與其他程式語言卻存在一些差異,下面列出幾項差異:
(1)SQL與一般的程式語言最大的不同在於SQL語句不論長短,只要是對資料庫而言是有效的,則它就是一個完整的指令,即可擷取資料庫中的特定資訊。也由於這樣的特性,我們可以藉由調校SQL敘述,來改變其執行效能。
(2)相同的SQL語句在不同時間執行,其執行時間及對資料庫的資源耗費程度也不盡相同。其原因在於資料庫對於SQL的處理,是依據當時資料庫的使用狀況,動態決定擷取資料的路徑。
(3)特別是關聯性資料庫在處理 SQL 指令時,會經過幾個步驟,請參照(圖一):
1.改寫SQL敘述並產生可能的執行計劃
資料庫利用內部的最佳化器(Optimizer)改寫SQL,並產生SQL的執行計劃(Execution Plan)。執行計劃可以看成是資料庫為了擷取特定資料所要經過的路徑。舉例來說,要從台北到高雄有許多種方式,可以做飛機、搭火車、開車走高速公路、開車走省道等等。資料庫亦可以有多種執行計劃來獲得相同的資料,每一種執行計劃對資料庫的執行成本、執行速度皆不同。
2.依據產生的執行計劃分別估計其執行成本
產生不同的執行計劃後,資料庫系統會根據本身的規則估計每一執行計劃的成本。成本的估計方式,各資料庫都不同,簡單而言是依據不同的存取方式分項估計,再加總而成。例如不同的scan方式、存取路徑,其所給的分數不同,最後再將這些項目加總而成。
3.選擇最低的執行成本執行該SQL指令
估計完每一個執行計劃後,資料庫系統選出一個估計成本最低的執行計劃來執行,擷取資料。
SQL 工具帶來的優勢
Q4.一般SQL tuning工具的開發理念為何? 使用SQL tuning的工具可為使用者帶來哪些利益?
答: SQL tuning 工具利用人工智慧( A.I. ),讓使用者在短時間內(例如十分鐘)完成平常可能需要兩三天工作量的SQL效能調整工作,並且確保調整後的SQL執行速度最佳或耗用成本最低。
團隊中往往有一些較初級的程式設計人員或資料庫管理人員,藉由SQL tuning工具,可以快速撰寫SQL或者不同資料庫專屬的資料查詢語言(例如:Oracle的PL/SQL,Sybase的Transact-SQL )。這種邊做邊學的方式,讓使用者在不影響專案進度的下,利用比較tuning後SQL與source SQL的不同,以及藉由看懂SQL執行計劃( Execution Plan ),訓練自己成為撰寫SQL指令的高手,間接提昇整個團隊的素質。