top
Loading...
SQL優化器探討

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

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

數據庫查詢優化器

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

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

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

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

圖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語句,都具有不同的執行計劃和性能。

不再依賴于不準確的成本估算

圖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將會在分擔數據庫查詢優化器的工作負荷上,扮演越來越重要的角色。

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗