《高性能SQL調優精要與案例解析》一書談SQL調優(SQL TUNING或SQL優化)學習


《高性能SQL調優精要與案例解析》一書上市發售以來,很多熱心讀者就該書內容及一些具體問題提出了疑問,因讀者眾多外加本人日常工作的繁忙 ,在這里就SQL調優學習進行討論並對熱點問題統一作答。

首先,我們說說何為SQL調優。SQL調優是關系庫領域的一項技能或工作,其來自SQL Tuning一詞,雖然也有很多同行更多稱之為SQL優化,對應的英文單詞為SQL Optimization,但本人始終認為SQL調優是一個過程,SQL調優也更能體現這項技術或工作的過程,而SQL優化一詞,本人認為更通俗些,也更能體現這項技術或工作的結果,個人認為SQL調優精確和專業些,因此,也更習慣將這項技能或工作稱為SQL調優。

其次,有些讀者會問道《高性能SQL調優精要與案例解析》一書中,前面五章是否和SQL調優相關,是否可有可無?本人認為這是本書的一大特色,那就是更注重基礎理論的講解和學習,任何一門技能的學習,基礎 和理論很重要,這也是本書的亮點和特性之一。不可否認,很多同類書中的案例非常好,也很有代表性,而恰恰是這些基礎理論的缺失,容易讓很大一部分讀者閱讀這些書籍時感到非常的迷茫。SQL調優的關鍵是根據SQL語句,執行計划和具體數據環境的對比,找出SQL語句解析和執行過程中出現問題的環節,進而才能通過最合理的措施去解決這個出問題的環節。SQL語句,這個一般不會存在問題,想學SQL調優的讀者,沒幾個不懂SQL語句的,具體數據環境,也不會存在問題,關鍵的問題是閱讀和分析執行計划,而做到這點的前提是能讀懂執行計划中的相關操作和數據項,然而,理解這些操作和數據項,是需要基礎理論的支撐的,也就是說,需要掌握數據庫相關的基礎理論的,比如:要理解全表掃描(FTS)操作,就得知道表的概念,段的概念,段的HWM的概念;要理解索引(INDEX)相關的操作,就得知道索引的概念,索引的組織結構,索引的特性;要理解分組和排序(GROUP BY和ORDER BY),我們就得知道私有內存區(PGA)是怎么回事兒,其是如何組織和管理的;要理解邏輯讀,我們就得理解緩沖區(Buffer),進而需要理解數據塊等概念。。。所以,要想真正掌握SQL調優,掌握這些基礎理論是必要的,否則,只看那些具體的案例,也沒多大意義,因為脫離了具體的理論,看那些案例根本就理解不了案例中那么做的根本原因,只掌握些方法,而不能理解,遇到問題只能生搬硬套,多數時候根本解決不了問題,還可能越弄越糟。當然,我不是說那些案例沒有用,在掌握了基礎理論后,去研究和分析一些案例,也是很有價值的。就像一位神醫給了我們一個絕世秘方,我們能看懂嗎?看不懂,因為我們不懂醫學知識,有用嗎?估計沒多大用,我們橫不能見到病人就用那個葯方,SQL調優解決問題,道理和醫生給人看病是一樣的,只是我們面對的是數據庫,醫生面對的是人而已。通過上面這些,我們知道,《高性能SQL調優精要與案例解析》一書中前四章基礎理論不但很重要,而且必須有。。第五章講的是事務相關內容,這章內容說實話,和SQL調優沒太大直接關系,但我為什么寫呢?因為關系庫中的鎖資源,是非常珍貴的資源,因為鎖機制實現方面因素,其他有些關系庫中鎖資源更加珍貴,而Oracle中鎖機制雖然更優越些,從而Oracle應用人員在涉及DML操作時可以更從容些,但這並不意味着可以為所欲為,現實中,即使很多資深研發人員,都不是很懂得Oracle事務的特性和應用,以至於經常不必要的用到手工加鎖的語句,這既造成了大量鎖相關資源的浪費,更主要的會造成嚴重的鎖阻塞和死鎖等問題,進而導致嚴重的后果,這也是本人在本書中增加事務一章內容的初衷。

再次,有些讀者會問到《高性能SQL調優精要與案例解析》一書主要以Oracle數據庫為例講解了SQL調優,而該書是否適用其他關系庫?本人寫該書的初衷,是為想學習SQL調優及從事該項工作的讀者提供一個學習和掌握SQL調優的正確而快捷的路徑和方法,而SQL調優這項技能,必須在深入理解和掌握關系庫機制和原理的前提下才能做好,而大家知道,各關系庫大的方面有很多共性,只是有些具體的細節會有所不同,就拿索引來說吧,各關系的實現細節是稍有差別的,然而,我們並不能期望各關系庫所有細節都完全一樣,畢竟,即使同一種關系庫,不同版本的具體細節也是有差別的,並且,有些差別還比較大,我們能做的只能是不斷學習和提升自己。因此,要想講解SQL調優這門技能,尤其是通過具體實例去講解,必須選擇某型關系庫進行具體講解,沒有誰能脫離具體的數據庫選型,能把SQL調優這門技能講清楚,因為脫離具體的數據庫,根本什么也講不了,也講不清楚。本人之所以選擇Oracle來進行講解,其一是關系庫市場上Oracle的占有率比較高,本人接觸的也比較多;其二,所有關系庫中,就優化器來講,Oracle的優化器也是最先進的。就SQL調優分析和解決問題的思路、方法和步驟來說,各關系庫幾乎是相同的,只是具體形式、命令、方法會有所差別,例如:Oracle獲取執行計划,可以通過GUI工具,可以通過命令行,也可以通過系統內置的包,還可以通過跟蹤來獲取;而SQL SERVER,也可以通過EM工具,通過命令行,也可以通過跟蹤獲取;而DB2和開源關系庫,也可以通過多種方法獲取SQL語句的執行計划。而閱讀和分析執行計划來說,各關系庫幾乎是相同的。Oracle提供了大量的系統視圖來獲取有些信息,高版本的SQL SERVER和DB2,甚至高版本的開源關系庫也提供了大量的系統視圖。Oracle對SQL語句的優化依賴統計數據,SQL SERVER和DB2也同樣依賴統計數據,甚至開源關系庫也依賴統計數據,只是他們生成和實現的機制和細節會有些差異。又比如說,Oracle提供了大量的hint,SQL server和db2也提供了hint這種調優方式,只是具體hint的作用和語法不同,開源庫有些版本也提供了hint功能,也許實現的沒那么完美而已。還有,本書雖然以Oracle為基礎講解,但在寫作過程中,也盡量注意剝離和泛化Oracle相關的一些具體特性和命令,並對與其他關系庫相通之處進行了說明和提示,以期盡量讓其他關系庫的讀者通過閱讀本書也能從中受益,從而達到觸類傍通的效果。

最后,非常感謝各位讀者的關注,如有任何疑問,可以通過本人郵箱、微博或本博客通知本人,如不能一一回復,也一定盡力抽時間統一答復,見諒,再次感謝。

 


免責聲明!

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



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