楊廷琨Oracle Code大會分享:如何編寫高效SQL(含PPT)
2018 Oracle Code 於5月17日在新加坡拉開帷幕。作為全球開發者交流分享的年度盛會,為吸引所有領域的開發者,Oracle今年將自1996年開始的JavaOne大會更名為 Oracle Code One,涵蓋全行業的高階技術人才。
雲和恩墨CTO楊廷琨受邀參加,並在大會上發表主題演講《How to write an efficient SQL》。
調查顯示,SQL是目前第二大程式語言,自誕生以來40多年一直髮揮著重要的作用,有50%的開發者都在使用SQL。雖然使用非常廣泛,但是SQL的質量水平卻並不令人滿意。
根據經驗80%的資料庫問題是由於SQL引起的,而80%的SQL問題來自於20%的SQL語句,在一些高併發高負載的系統中,由於一條SQL的效能問題導致資料庫整體出現異常的情況屢見不鮮,這也是楊廷琨本次選擇這個主題的原因,希望幫助更多的開發人員可以書寫出高效的SQL語句。
本次主題包括四方面的內容:合理的使用新特性;資料集整體處理;設計SQL執行計劃;嚴格過濾資料。
合理的使用新特性,可以避免重複訪問資料,合併簡化執行操作過程,快取中執行間結果,減少自關聯,高效靈活的處理一些複雜問題。因此,充分理解新特性的功能以及其適用場景,是書寫高效SQL語句的基礎。
SQL本身是描述性語言,大部分情況下使用SQL的時候並不需要特別關注每行資料如何去處理,將資料整理處理作為思路,會發現SQL的效能會更好,而且很多時候SQL的寫法也會更加簡潔。
好的效能是設計出來的,因此如果想寫出高效的SQL語句,要從一開始就考慮好這個SQL的執行計劃,驅動表是誰,採用何種JOIN方式連線到被驅動表。設計思路是一方面,另一方面是保證執行計劃符合設計思路,這時候就需要用到提示的功能。熟悉提示的功能,可以更好的控制SQL的執行路徑,繞過bug或效能問題,強制SQL按照設計思路去執行。
過濾不必要的資料對於提升SQL的效能非常重要,對於一個計算10000以內質數的SQL,未經優化前需要1分12秒的執行時間,消耗17萬邏輯讀。
通過嚴格的資料過濾,在執行的第一步消除不必要的資料,最終優化後的SQL只需要0.05秒,消耗461的邏輯讀,執行時間和邏輯讀都有幾百倍的提升。
楊廷琨先生是中國地區的第一批Oracle ACE總監,也是 ITPUB 論壇上最活躍的分享者之一,他日均一篇的部落格更新堅持了10年之久,影響了很多Oracle DBA和開發者的學習和成長,他在SQL開發方向的積累豐富,對於效能和效率具有深刻理解。
楊廷琨先生作為中國地區技術的傑出代表,與來自世界各地的開發精英以開放的心態,共享技術成果,期間著重強調書寫高效SQL的祕訣,除了之前介紹的四點之外,還要下面三個因素:多寫多練:熟能生巧;深思熟慮:演算法為王;堅持不懈:優化無止境。