SQL優化器探討(zt)

zhouwf0726發表於2019-01-10
SQL優化器探討


  多年以來,商業資料庫生產商一直致力於提高資料庫的查詢效能。儘管他們持續地付出努力和辛勤地工作,我們還是無法看到關係型資料庫系統(RDBMS)在效能上有顯著的提高。使用者繼續忍受效能低下的SQL語句,資料庫專家們繼續在SQL語句優化的泥潭中痛苦掙扎。

  本文將介紹資料庫查詢優化器是如何工作的、為什麼問題持續存在,並深入探討資料庫查詢優化器將來的發展方向。

  資料庫查詢優化器

  資料庫查詢優化器是RDBMS伺服器的一個組成部分。對於基於成本的優化,資料庫查詢優化器的任務是,通過產生可供選擇的執行計劃,找到最低估算成本的執行計劃,來優化一條SQL語句。它在SQL語句效能表現上扮演了至關重要的角色。

  當一條SQL語句被送入RDBMS伺服器,它將會被解析並提交給資料庫查詢優化器。查詢優化器將會進行查詢重寫和表示式評估,以產生可供選擇的執行計劃。產生可供選擇的執行計劃的數量,取決於在RDBMS中定義的計劃空間(PLAN SPACE)大小。對於每個待選的執行計劃,成本估計將被計算,帶有最小成本的執行計劃將被選取用來執行SQL語句。這種方法存在著兩個無法解決的問題:無法產生全部可能的可選執行計劃和成本估計的不準確。

  新的SQL優化概念——外部SQL重寫器

  一個有經驗的程式設計師,把有問題的SQL語句的速度提高數千倍是很常見的。憑著對具體資料庫特徵的瞭解,對SQL語句進行語法的重新構造。一個開發人員能夠幫助查詢優化器獲得更好的執行計劃,而這執行計劃是查詢優化器無法靠自身獨立工作產生的。這給予我們一個啟示,我們是否能通過計算機模擬人的行為,來實現同樣的目的呢?

  SQL優化器探討(zt)screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window CTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://www.zhujiangroad.com/upload/soft/200611274113.jpg');}" src="http://www.zhujiangroad.com/upload/soft/200611274113.jpg" onload="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window CTRL+Mouse wheel to zoom in/out';}" border="0" />   

圖1 ESR依據資料庫的特性重寫和替代有問題的SQL語句

  圖1顯示了外部SQL重寫器(External SQL Rewriter--ESR)的概念,它能夠基於現有資料庫的特性,產生語義相等但語法不同的SQL語句。重寫產生的SQL語句,將取代程式原始碼中的源SQL語句。這樣,當程式執行時(使用新的SQL語句),查詢優化器將會被影響,而產生效能更好的執行計劃。事實上,有經驗的程式設計師和資料庫管理員,一直在期盼著這個概念的出現。這個概念的新穎之處在於,將人類的知識和智慧合併到一個計算機演算法中,它能夠打破計劃空間(PLAN SPACE)限制的障礙,避免在尋找最佳SQL語句時不準確的成本估算。

  ESR的優點是,它的優化並非一個基於實時,可用於重寫和優化SQL語句的時間,在理論上是無限的。它可以比資料庫的查詢優化器嘗試更多的待選SQL語句。使用者花費多達一天的時間來處理關鍵SQL語句的效能問題,而ESR可以徹底尋找可能的待選執行計劃。ESR的另外一個優點是,能夠達到SQL效能提高的目的,而無需進行額外的統計,使資料庫查詢優化器的負載過重。因此,ESR使得提升整個資料庫效能變得簡單且安全。最後,ESR相對於資料庫內部的查詢優化器更加靈活:SQL重寫的知識庫可以很容易擴充套件,搜尋空間可以通過硬體的升級來擴充套件,而毫無限制和缺點。

  ESR是如何工作的?

  為了讓ESR能夠優化SQL語句,必須避免資料庫內部查詢優化器限制所產生的障礙。另外,ESR必須擁有重寫SQL語句的智慧,並知道你資料庫的特性,來提供待選的SQL語句。儘管達到上面的要求是困難的,但是開發一個這樣的演算法也不是不可能的。國內市場上已經由盈動華建公司代理推出了一個相當成熟的產品——LECCO Technology 的LECCO SQL Expert。

  SQL語句可以被直接輸入,或通過檢查原始碼來捕獲有問題的SQL語句。當ESR收到SQL語句,一個遞迴的轉換演算法被應用來重寫源SQL語句,產生每一個可能的語義等價的待選SQL語句。遞迴的SQL轉換引擎,擁有內建的人工智慧和SQL轉換規則,它依照具體資料庫的特性來重新構造SQL語句。

  可擴充套件的計劃空間

  使用者可自定義的限額讓使用者能夠控制搜尋空間。如果使用者對在定義的限額內產生的結果不滿意,或無法找到效能更好的待選SQL語句,使用者可以提高限額來增加搜尋空間,直到更多的待選SQL語句被找到。因此,ESR的計劃空間的擴充套件,要比資料庫查詢優化器有彈性得多。另一個考慮周到的特性是,ESR可以在內部把具有重複執行計劃的SQL語句給排除掉。這樣不僅減少了人工反覆嘗試的成本,還保證了重寫產生的每條SQL語句,都具有不同的執行計劃和效能。

  不再依賴於不準確的成本估算   SQL優化器探討(zt)screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window CTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://www.zhujiangroad.com/upload/soft/200611273343.jpg');}" src="http://www.zhujiangroad.com/upload/soft/200611273343.jpg" onload="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window CTRL+Mouse wheel to zoom in/out';}" border="0" />   

圖2 ESR的簡單圖示


  儘管ESR能夠擴大它的計劃空間和產生更多的待選SQL語句,它還是和資料庫內部查詢優化器一樣,面對著不準確的成本估算的問題。沒有實際地執行過每一條重寫後的SQL語句,是根本無法知道,在所有待選SQL語句中到底哪一條的效能最好。因此,實際的途徑是,測試執行所有的待選SQL語句。圖2中的ESR例子使用了這一方法並附加提供了測試選項來找到效能最好的SQL語句。使用者可以選擇,什麼時候來開始測試和允許進行多長時間的測試。此外,ESR的重要性還在於,整個優化過程不需要使用者具有資料庫專家的經驗。正如我們所知道的,不同的SQL語法可以引起資料庫查詢優化器產生不同的執行計劃,因此ESR也必須具有模擬人工重寫SQL語句的能力。遞迴式SQL語法轉換技術,正是用來模擬人的SQL轉換方法。它合併一系列有用的轉換規則,並使用一次觸發一條的方法來轉換SQL語句。所有的轉換規則是不互相依賴的,就像一個個密封的小門,只有在所有必需的條件都滿足的情況下,某個密封門才會被開啟。這保證了重寫後的SQL語句與原SQL語句在語義上是等效的。

  ESR技術的展望

  隨著硬體的升級,ESR能夠合併更多的SQL轉換規則,來處理資料庫的新特性和更復雜的SQL語句,理論上,規則的數量是沒有限制的。將來,隨著資料庫生產商在讓使用者影響資料庫優化器方面更加開放,ESR將會在優化策略方面得到更多的控制。毫無疑問,ESR將會在分擔資料庫查詢優化器的工作負荷上,扮演越來越重要的角色。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/756652/viewspace-242452/,如需轉載,請註明出處,否則將追究法律責任。

相關文章