關係查詢優化是影響關聯式資料庫管理系統效能的關鍵因素。查詢優化的優點不僅在於使用者不必考慮如何最好地表達查詢以獲得較高的效率,而且在於系統可以比使用者程式的「優化」做得更好。
1. 優化可以從資料字典中獲得更多統計資訊。
2. 如果資料庫的物理統計資訊改變了,系統可以自動對查詢進行重新優化以選擇相適應的執行計畫。在非關係系統中則必須重寫程式,而重寫程式在實際應用中往往是不太可能的。
3. 優化器可以考慮數百種不同的執行計畫,而程式設計師一般只能考慮有限的幾種可能性。
4. 優化器中包括了很多複雜的優化技術,這些優化技術往往只有最好的程式設計師才能掌握。系統的自動優化相當於使得所有人都擁有這些優化技術。
在集中式資料庫中,查詢執行開銷主要包括磁碟訪問塊數(i/o代價)、處理機時間(cpu代價)以及查詢的記憶體開銷。在分布式資料庫中還要加上通訊代價,即:
總代價=i/o代價+cpu代價+記憶體代價+通訊代價。
由於磁碟i/o操作涉及機械動作,需要時間與記憶體操作相比要高幾個數量級,在計算查詢代價時一般用查詢處理讀寫的塊數作為衡量單位。
查詢優化的總目標是選擇有效的策略,求得給定關係表示式的值,使得查詢代價較小,因為查詢優化的搜尋空間有時非常大,實際系統選擇的策略不一定是最優的,而是較優的。
代數優化是基於關係代數等價變換規則的優化方法。
代數優化策略是通過對關係代數表示式的等價變換來提高查詢效率。所謂關係代數表示式的等價是指用相同的關係代替兩個表示式中相應的關係所得到的結果是相同的。兩個關係表示式e1和e2是等價的。
查詢樹的啟發式優化
典型的啟發式規則:
1. 選擇運算應盡可能先做。
2. 把投影運算和選擇運算同時進行。如有若干投影和選擇運算,並且它們都對同乙個關係操作,則可以在掃瞄次關係的同時完成所有這些運算以避免重複掃瞄關係。
3. 把投影同其前或後的雙目運算結合起來,沒有必要為了去掉某些欄位而掃瞄一遍關係。
4. 把某些選擇同在它前面要執行的笛卡兒積結合起來成為乙個連線運算,連線(特別是等值連線)運算要啊比同樣關係上的笛卡兒積省很多時間。
5. 找出公共子表示式。
代數優化改變查詢語句中操作的次序和組合,但不涉及底層的訪問路徑。物理優化就是要選擇高效合理的操作演算法或訪問路徑,求得優化的查詢計畫,達到查詢優化的目標。
選擇的方法可以是:
1. 基於規則的啟發式優化。
2. 基於代價估算的優化。
3. 兩者結合的優化方法。常常先使用啟發式規則選取若干個較優的候選方案,減少代價估算的工作量,然後分別計算這些候選方案的執行代價,較快地選出最終的優化方法。
基於啟發式規則的訪問路徑選擇優化
選擇操作的啟發式規則
對於小關係,使用全表順序掃瞄,即使選擇列上有索引。
對於大關係,啟發式規則有:
1. 對於選擇條件是「主碼=值」的查詢,查詢結果最多是乙個元組,可以選擇主碼索引,一般都關聯式資料庫管理系統會自動建立主碼索引。
2. 對於選擇條件是「非主屬性=值」的查詢,並且選擇列上有索引,則要估算查詢結果的元組數目,如果比例較小(<10%)可以使用索引掃瞄方法,否則還是使用全表順序掃瞄。
3. 對於選擇條件是屬性上的非等值查詢或者範圍查詢,並且選擇列上有索引,同樣要估算查詢結果的元組數目,如果選擇率<10%可以使用索引掃瞄方法,否則使用全表順序掃瞄。
4. 對於用and連線的合取選擇條件,如果有涉及這些屬性的組合索引,則優先採用組合索引掃瞄方法;如果某些屬性上有一般索引,則可以使用索引掃瞄方法,否則使用全表順序掃瞄。
5. 對於or連線的析取選擇條件,一般使用全表順序掃瞄。
基於代價估算的優化
啟發式規則優化是定性的選擇,比較粗糙,但是實現簡單而且優化本身的代價較小,適合解釋執行的系統。因為解釋執行的系統,其優開銷包含在查詢總開銷之中,在編譯執行的系統中,一次編譯優化,多次執行,查詢優化和查詢執行是分開的,因此,可以用精細複雜一些的基於代價的優化方法。
查詢優化完成後,關聯式資料庫管理系統為使用者查詢生成了乙個查詢計畫。該計畫的執行可以分為自頂向下和自底向上兩種執行方法。
1. 自頂向下
系統反覆向查詢計畫頂端的操作符發出需要查詢結果元組的請求,操作符收到請求後,就試圖計算下乙個(幾個)元組並返回這些元組。在計算時,如果操作符的輸入緩衝區為空,它就會向其孩子操作符傳送需求元組的請求……這種需求元組的請求會一直傳到葉子節點,啟動葉子操作符執行,並返回其父操作符乙個(幾個)元組,父操作符再計算自己的輸出返回給上層操作符,直至頂端操作符。重複這一過程,直到處理完整個關係。
2. 自底向上
查詢計畫從葉結點開始執行,葉節點操作符不斷地產生元組並將它們放入其輸出緩衝區中,直到緩衝區填滿為止,這時它必須等待其父操作符將元組從該緩衝區中取走才能急促執行,然後其父結點操作符開始執行,利用下層的輸入元組來產生它自己的輸出元組,直到其輸出緩衝區滿為止,重複這個過程,直到產生所有的輸出元組。
向下的執行方式是一種被動的、需求驅動的執行方式。而自底向上的執行方式是一種主動的執行方式。總結:
對於比較複雜的查詢,尤其是涉及連線和巢狀的查詢,不要把優化的任務全部放在關聯式資料庫管理系統上,應該找出關聯式資料庫管理系統的優化規律,以寫出適合關聯式資料庫管理系統自動優化的sql語句,對於關聯式資料庫管理系統不能優化的查詢需要重寫查詢語句,進行手工調整以優化效能。
關聯式資料庫的查詢優化策略
1 引言 隨著計算機應用技術的不斷普及和發展,資料庫系統正越來越多的走進人們的日常生活。在要求查詢結果正確無誤的同時,人們越來越關心查詢的效率問題。影響查詢效率的因素很多,諸如處理器的速度 i o速度 儲存器的容量 作業系統 採取何種的資料庫服務系統等。但是對於特定伺服器來說查詢的效率主要取決於db...
關聯式資料庫查詢優化的初次體驗
最近一直在看關係資料庫系統知識,主要還是從概念上去了解關聯式資料庫的一些知識,之前沒有系統的學習這方面的知識,現在重新去構建這塊的知識體系。學習到關係查詢優化這塊的知識,通過對書本上的分析,了解到查詢優化這塊的知識,起初在我的知識裡,我認為rdbms會優化查詢這塊的內容,即認為所有人寫的查詢被rdb...
關聯式資料庫與非關聯式資料庫
關係型資料庫,是指採用了關係模型來組織資料的資料庫。關係模型是在1970年由ibm的研究員e.f.codd博士首先提出的,在之後的幾十年中,關係模型的概念得到了充分的發展並逐漸成為主流資料庫結構的主流模型。簡單來說,關係模型指的就是二維 模型,而乙個關係型資料庫就是由二維表及其之間的聯絡所組成的乙個...