《數據庫系統概論》第九章筆記


第九章 關系查詢處理和查詢優化

本章主要介紹關系數據庫的查詢處理和查詢優化技術。
本章中重點為一些查詢優化的思想。
查詢優化一般可分為:

  • 代數優化(邏輯優化)
  • 物理優化(非代數優化)

9.1 關系數據庫系統的查詢處理

定義:

  • 查詢處理是關系數據庫管理系統執行查詢語句的過程。

任務:

  • 其任務是把用戶提交給關系數據庫的查詢語句轉換為高效的查詢執行計划

9.1.1 查詢處理步驟

查詢處理分為4個階段:

  • 查詢分析
  • 查詢檢查
  • 查詢優化
  • 查詢執行

查詢分析

定義:

  • 對查詢語句進行掃描、詞法分析和語法分析。

目的:

  • 判斷是否有語法錯誤;
    • 無錯,進入下一步;
    • 有錯,則報告語法錯誤

查詢檢查

定義:

  • 對合法的查詢語句進行語義分析、符號名轉化、安全性檢查和完整性初步檢查

目的:

  • 根據數據字典中有關的模式定義,檢查語句中的數據庫對象是否存在和有效;
  • 如果是對視圖的操作,則要用視圖消解的方法轉化成對基本表的操作;
  • 還要根據數據字典中用戶權限和完整性約束的定義,對用戶的存取權限進行檢查;
    • 無權限或違反完整性約束,將拒絕執行該查詢
    • 此時的完整性檢查,是初步的、靜態的檢查

檢查通過后:

  • 將把SQL查詢語句轉換成內部表示,即等價的關系代數表達式。這個過程中把數據庫對象的外部名稱轉換成內部表示。
  • 關系數據庫關系系統一般都用查詢樹,也稱為語法分析樹來表示擴展的關系代數表達式

查詢優化

定義:

  • 每個查詢都會有許多可供選擇的執行策略和操作算法,查詢優化就是選擇一個高效執行的查詢處理策略。

按照優化的曾以一般可將查詢優化分為:

  • 代數優化
    • 指關系代數表達式的優化,即按照一定的規則,對關系代數表達式進行等價變換,改變代數表達式中操作的次序和組合,使查詢執行更高效
  • 物理優化
    • 指存取路徑和底層操作算法的選擇。選擇的依據一般有三種:
      • 基於規則
      • 基於代價
      • 基於語義

查詢執行

依據優化器得到的執行策略生成查詢執行計划,由代碼生成器生成執行這個查詢計划的代碼,然后加以執行,回送查詢結果。

9.1.2 實現查詢操作的算法

就不根據例子講了,想具體可以直接看書,這里就記錄下幾種算法思想

選擇操作的實現算法:

  • 簡單的全表掃描算法(table scan)
  • 索引掃描算法(index scan)

選擇操作時查詢處理中最常用也是最耗時的操作之一。

連接操作的實現算法:

  • 嵌套循環算法(nested loop join)
  • 排序-合並算法(sort-merge join 或者 merge join)
  • 索引連接算法(index join)
  • hash join算法

簡單的全表掃描算法

算法思想:

  • 按照物理次序讀表的M塊到內存
  • 檢查內存中的每一個元組t,如果t滿足選擇條件,則輸出t
  • 如果表中還有未處理的塊,重復前兩步

優點:

  • 只需要很小的內存就可以運行(最少1塊)
  • 對於規模較小的表,這種算法簡單有效

缺點:

  • 當表的規模很大,並且選擇率(即滿足條件的元組占全表比例)很低時,這種算法的效率較低。

索引掃描算法

如果選擇條件上有索引(例如B+樹索引或hash索引),可以用索引掃描方法。

算法思想:

  • 先通過縮影找到滿足條件的元組指針
  • 再通過元組指針在基本表中找到元組

與全表掃描算法比較:

  • 一把情況下,當選擇率較低時,基於索引的選擇算法要優於全表掃描算法。
  • 但再某些情況,例如選擇率較高,或者要查找的元組均勻分布再查找的表中,這時基於索引的選擇算法性能不如全表掃描算法
    • 這是因為除了對表的掃描操作,還要加上對B+樹索引的掃描操作,對每一個檢索碼,從B+樹根節點到葉子節點都要執行一次I/O操作。

特殊情況說明:

選擇條件Sdept = 'cs' AND Sage > 20,如果SdeptSage上都有索引。

則有兩種算法可選:

  • 一種是通過索引分別找到兩個條件的元組指針集合,再求兩個集合的交集,再到基本表中去檢索。
  • 另一中算法是通過Sdept = 'cs'找到一個元組指針集合,然后遍歷這個指針集合,到基本表中將滿足另一條件(Sage > 20)的元組選擇輸出。

嵌套循環算法

這是最簡通用的算法,可以處理包括非等值連接在內的各種連接操作。

算法思想:(連接條件:left.a = right.b)

  • 對外層循環(左表)的每一個元組,檢索內層循環(右表)中的每一個元組,並檢查來這兩個元組再連接屬性上是否相等。
  • 如果滿足連接田間,則串接后作為結果輸出,直到外層循環表中的元組處理完。

說白了就是兩個for循環,時間復雜度O(N*M)

注意:

再實際實現中,數據存取時按數據塊讀入內存中的,而不是按照元組進行I/O。

排序-合並算法

這是等值連接常用的算法,尤其適合參與連接的諸表已經排好序的情況。

算法思想:(連接條件:left.a = right.b)

  • 如果參與連接的表沒有排好序,首先將兩個表分別按照連接屬性排好序
  • left表的第一個a,依次掃描right表的具有b=a的元組,把它們連接起來
  • 當掃描到rightb!= ad的第一個元組時,返回left表掃描它的下一個元組

說白了,就時先排序,然后兩個for循環,記錄內存循環的index,同時內存循環加break條件。排序時間復雜度O(N*log(N)),循環時間復雜度O(N+M)。

優點:

  • 雖然時間主要花在排序上,但是相比嵌套循環算法,在表規模較大時,還是能減少很多時間

索引連接

算法思想:(連接條件:left.a = right.b)

  • 要求在right表上已經建立了屬性b的索引
  • 對於left中的每一個元組,由a的值,通過b的索引找到相應的right表元組
  • 將左右表的元組連接起來
  • 循環執行第二、三步,直到左表元組全部處理完

算法時間復雜度:

  • 根據索引查找依次的時間復雜度O(layers),layers表示層數,一次查找需要比較layers-1次
  • 所以總的算法復雜度是,O(N*layers)

hash join算法

hash join 算法也是處理等值連接的算法。

算法思想:

  • 划分階段:創建 hash 表,對包含較少元組的表,進行一遍處理,把它的元組通過連接屬性按 hash 函數,分散到 hash 表的桶中;
  • 連接階段:對另一個表,同樣進行一遍散列處理,找到合適的 hash 桶,將兩個的匹配的元組連接起來。(感覺書上沒表述清,應該是當發現 hash 表中已有key值時,將兩個value對應的元組連接)

其實也是通過hash來快速匹配,從而減少循環次數。

算法時間復雜度O(N+M)。

缺點:

  • 需要一個前提條件,數據量較小的表,在第一階段后,能完全放入內存中的 hash 桶中。
  • 有克服了這一缺點的改進算法,書中列出了英文參考文獻,有需要深入研究的可以找找

9.2 關系數據庫系統的查詢優化

關系查詢優化是影響關系數據庫管理系統性能的關鍵因素。

9.2.1 查詢優化概述

查詢優化的優點;

  • 不僅在於用戶不必考慮如何最好地表達查詢以獲得較高的效率;
  • 而且在於系統可以比用戶程序的“優化”做得更好。

這是因為:

  • 優化器可以從數據字典中獲取許多統計信息(例如,每個關系表的元組數、每個屬性值的分布情況、哪些屬性上有索引等),從而根據這些信息做出正確的估計,選擇高效的執行計划。(信息全面)
  • 如果數據庫的物理統計信息改變了,系統可以自動對查詢進行重新優化以選擇相適應的執行計划。(自適應)
  • 優化器可以考慮數百種不同的執行計划,而程序員一般只能考慮有限的幾種可能性。(考慮周全)
  • 優化器中包含了很多復雜的優化技術,這些優化技術往往只有最好的程序員才能掌握。系統自動優化相當於所有熱都擁有了這些技術。(掌握高級技術)

執行計划的選取:

  • 目前關系數據庫系統 通過某種代價模型計算出各種查詢執行策略的執行代價,然后選取代價最小的執行方案

在集中式數據庫中,查詢執行開銷主要包括:

  • 磁盤存取塊數(I/O代價)
    • 由於磁盤I/O,涉及機械動作,需要的時間相比內存操作要高幾個數量級。一般將讀寫的塊數,作為衡量查詢代價的單位。
  • 處理機時間(CPU代價)
  • 查詢的內存代價

分布式數據庫中,則還要加上:

  • 通信代價

9.2.2查詢優化的一個實例

書上這節專門介紹了一個例子,對比使用三種查詢方式需要讀寫的塊數,來說明查詢優化的重要性。這里簡單說下,就不想詳細計算了。

select Student.Sname from Student,SC where Student.Sno = SC.Sno and SC.Cno = '2'

第一種方式:

  • 計算兩個表的廣義笛卡兒積
    • 這一步產生的結果集太大,需要寫入中間文件,寫入塊數大
  • 從廣義笛卡兒積中根據兩個選擇條件做選擇操作
    • 讀取上一步中間文件,讀取塊數大
  • 作投影操作,選出需要的列

第二中方式:

  • 根據Student.Sno = SC.Sno計算兩個表的自然連接
    • 由於已經用條件篩選了,中間文件減小很多,寫入塊數較小
  • 從自然連接結果集中,根據SC.Sno = '2'做選擇操作
    • 同樣讀取中間文件,讀取塊數較小
  • 投影輸出

第三種方式:

  • 根據SC.Sno == '2'SC表做選擇操作
    • 對單個表用等值條件篩選了,一般來講,結果集較小,不需要中間文件,直接存在內存中
  • 將第一步的結果集,與Student表根據Student.Sno = SC.Sno做自然連接
    • 不需要讀中間文件
  • 投影輸出

總結一下這個例子的用意:

  • 說明了查詢優化的必要性
  • 給出了查詢優化方法的初步概念:有選擇和連接操作時,應先執行選擇操作,使下一步要操作的集合趨於更小
  • 上面三種方式,其實對應三個三個等價的代數表達式,顯然前兩個可以優化為第三個,從而引出下一節代數優化。

9.3 代數優化

代數優化策略是通過關系代數表達式的等價變換來提高查詢效率的。

9.3.1 關系代數表達式等價變換規則

這一節列出了,11條等價變換規則,這里就不介紹了,有個概念就行。無非就是等價變換使整個執行代價越小越好。

9.3.2 查詢樹的啟發優化

查詢樹就是執行的步驟。

典型的啟發式規則有:(啟發式規則指大多數情況下都適用,但是不是在每種情況下都是最好的規則)

  • 選擇運算應盡可能先做。
    • 能使計算的中間結果大大變小
  • 把投影運算和選擇運算同時進行。
    • 把同一關系的投影運算和選擇運算同時進行,避免重復掃描關系
  • 把投影桶其前或后的雙目運算結合起來
    • 與第二條的目的類似
  • 把某些選擇同在它前面要執行的笛卡兒積結合起來稱為一個連接運算
    • 同樣
  • 找出公共子表達式。
    • 把公共子表達式結果存為中間結果,從外存讀取中間結果的時間一般會比重新計算一次少很多。

9.4 物理優化

對於一個查詢語句有許多存取方案,它們的執行效率不同,有的會相差很大;物理優化就是要選擇高效合理的操作算法或存取路徑,求得優化的查詢計划,達到查詢優化的目標。

物理優化方法有:

  • 基於規則的啟發式優化。
  • 基於代價估算的優化。
  • 兩者結合的優化方法。
    • 基於規則選取幾種較優的候選方案,計算代價選出最優的方案。而不用計算所有的方案,較少代價估算的工作量。

9.4.1 基於規則的啟發式優化

選擇操作的啟發式規則:

  • 對於小關系,適用全表掃描,即使選擇列上有索引。
  • 對於大關系,啟發式規則有:
    • 對於選擇條件是“主碼=值”的查詢,查詢結果最多是一個元組,可以選擇主碼索引。
    • 對於選擇田間是“非主碼=值”的查詢,並且選擇列上有索引,則要估算查詢結果的元組數目,如果比例較小(<10%)可以使用索引掃描方法,否則還是適用全表順序掃描。
      • 索引記錄的使每個元組的指針,重復率較高時,需多次根據指針去讀取相應元組
      • 而全表掃描,可以直接按存儲順序讀取多個塊(一個塊包含多個元組)到內存中,所以重復率較高時,可能全表掃描更快。
    • 對於選擇條件是屬性上的非等值查詢或者范圍查詢,並且選擇列上有索引,處理方法與上一條相同
    • 對於用AND連接的合取條件
      • 如果有涉及這些屬性的組合索引,則優先采用組合索引掃描方法
      • 如果某些屬性上有一般索引,可參考上面9.1.2節中,索引掃描算法中的兩種
    • 對於用OR連接的析取選擇條件,一般使用全表掃描。

連接操作的啟發式規則:

  • 如果2個表都已經按照連接屬性排序,則選用排序-合並算法。
  • 如果一個表在連接屬性上有索引,則可以選用索引連接算法。
  • 如果上面2個規則都不適用,其中一個表較小。則可以選用hash join 算法
  • 如果可以選用嵌套循環算法,則應該選擇較小地表作為外循環的表

9.4.2 基於代價估算的優化

與啟發式規則優化比較:

  • 啟發式規則優化:
    • 是定性的選擇,比較粗糙;
    • 但是實現簡單,而且優化本上的代價較小
    • 適合解釋執行的系統。因為解釋執行系統,其優化開銷包含在查詢總開銷中
  • 代價估算優化
    • 是定量的選擇,比較精細
    • 實現較復雜,需要根據統計信息做多次計算
    • 適合編譯執行的系統,一次編譯,多次執行,查詢優化和查詢執行是分開的。

9.5 查詢計划的執行

查詢優化完成之后,關系數據庫管理系統為用戶查詢生成了一個查詢計划。

查詢計划的執行可分為兩種:

  • 自頂向下的執行方式
    • 是一種被動的、需求驅動的執行方式
  • 自底向上的執行方式
    • 是一種主動的執行方式


免責聲明!

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



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