1. 程式人生 > >資料庫總結第九章

資料庫總結第九章

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

9.1 關係資料庫系統的查詢處理

  1. 本章內容: -p
    1. 關係資料庫管理系統的查詢處理步驟
    2. 查詢優化的概念
    3. 基本方法和技術
    4. 查詢優化分類 :
    5. 代數優化:指關係代數表示式的優化
    6. 物理優化:指存取路徑和底層操作演算法的選擇

查詢處理步驟

  1. 關係資料庫管理系統查詢處理階段 :

1. 查詢分析

2. 查詢檢查

3. 查詢優化

4. 查詢執行  

實現查詢操作的演算法示例

  1. 選擇操作的實現
  2. 連線操作的實現
  1. 選擇操作典型實現方法:

(1) 全表掃描方法 (Table Scan)

      1. 對查詢的基本表順序掃描,逐一檢查每個元組是否滿足選擇條件,把滿足條件的元組作為結果輸出
      2. 適合小表,不適合大表

(2)索引掃描方法 (Index Scan)

      1. 適合於選擇條件中的屬性上有索引(例如B+樹索引或Hash索引)
      2. 通過索引先找到滿足條件的元組主碼或元組指標,再通過元組指標直接在查詢的基本表中找到元組
  1. 全表掃描演算法
    1. 假設可以使用的記憶體為M塊,全表掃描演算法思想:
      1. 按照物理次序讀Student的M塊到記憶體
      2. 檢查記憶體的每個元組t,如果滿足選擇條件,則輸出t
      3. 如果student還有其他塊未被處理,重複①和②
  2. 索引掃描演算法
  1. [例9.1-C2] SELECT *

                     FROM Student

                     WHERE    Sno='201215121'

    1. 假設Sno上有索引(或Sno是雜湊碼)
    2. 演算法:
      1. 使用索引(或雜湊)得到Sno為‘201215121’ 元組的指標
      2. 通過元組指標在Student表中檢索到該學生
  1. [例9.1-C3] SELECT *

                      FROM Student

                      WHERE    Sage>20

    1. 假設Sage 上有B+樹索引
    2. 演算法:
      1. 使用B+樹索引找到Sage=20的索引項,以此為入口點在B+樹的順序集上得到Sage>20的所有元組指標
      2. 通過這些元組指標到student表中檢索到所有年齡大於20的學生。
  1. [例9.1-C4] SELECT *

                      FROM Student

                      WHERE Sdept='CS' AND Sage>20;

    1. 假設Sdept和Sage上都有索引
    2. 演算法一:分別用Index Scan找到Sdept=’CS’的一組元組指標和Sage>20的另一組元組指標
      1. 求這兩組指標的交集
      2. 到Student表中檢索
      3. 得到計算機系年齡大於20的學生
    3. 演算法二:找到Sdept=’CS’的一組元組指標,
      1. 通過這些元組指標到Student表中檢索
      2. 並對得到的元組檢查另一些選擇條件(如Sage>20)是否滿足
      3. 把滿足條件的元組作為結果輸出。 
  1. 連線操作是查詢處理中最耗時的操作之一
  2. 本節只討論等值連線(或自然連線)最常用的實現演算法

(1)巢狀迴圈演算法(nested loop join)

(2)排序-合併演算法(sort-merge join 或merge join)

(3)索引連線(index join)演算法

(4)Hash Join演算法

9.2 關係資料庫系統的查詢優化

  1. 查詢優化在關係資料庫系統中有著非常重要的地位
  2. 關係查詢優化是影響關係資料庫管理系統效能的關鍵因素
  3. 由於關係表示式的語義級別很高,使關係系統可以從關係表示式中分析查詢語義,提供了執行查詢優化的可能性 

查詢優化概述

  1. 關係系統的查詢優化
    1. 是關係資料庫管理系統實現的關鍵技術又是關係系統的優點所在
    2. 減輕了使用者選擇存取路徑的負擔
  2. 關係資料庫管理系統通過某種代價模型計算出各種查詢執行策略的執行代價,然後選取代價最小的執行方案
    1. 集中式資料庫
      1. 執行開銷主要包括
        1. 磁碟存取塊數(I/O代價)
        2. 處理機時間(CPU代價)
        3. 查詢的記憶體開銷
      2. I/O代價是最主要的  
    2. 分散式資料庫
      1. 總代價=I/O代價+CPU代價+記憶體代價+通訊代價
  3. 查詢優化的總目標
    1. 選擇有效的策略
    2. 求得給定關係表示式的值
    3. 使得查詢代價最小(實際上是較小)

9.3 代數優化

關係代數表示式等價變換規則

  1. 代數優化策略:通過對關係代數表示式的等價變換來提高查詢效率
  2. 關係代數表示式的等價:指用相同的關係代替兩個表示式中相應的關係所得到的結果是相同的
  3. 兩個關係表示式E1和E2是等價的,可記為E1≡E2 
  4. 常用的等價變換規則:

1.連線、笛卡爾積交換律

       設E1和E2是關係代數表示式,F是連線運算的條件,則有

        E1  × E2≡E2  × E1

        E1      E2≡E2      E1

        E1      E2≡E2      E1

2.連線、笛卡爾積的結合律

      設E1,E2,E3是關係代數表示式,F1和F2是連線運算的條件

        (E1  × E2) × E3≡E1 × (E2 × E3)

        (E1      E2)      E3≡E1     (E2     E3)

        (E1      E2)      E3≡E1     (E2     E3)

3.投影的串接定律

                  (           (E))≡              (E)

    1. E是關係代數表示式
    2. Ai(i=1,2,…,n),Bj(j=1,2,…,m)是屬性名
    3. {A1,A2,…,An}構成{B1,B2,…,Bm}的子集

4.選擇的串接定律

            (      (E ))≡             (E)

    1. E是關係代數表示式,F1、F2是選擇條件
    2. 選擇的串接律說明選擇條件可以合併,這樣一次就可檢查全部條件

5.選擇與投影操作的交換律

    σF(                (E))≡                  (σF(E))

    1. 選擇條件F只涉及屬性A1,…,An
    2. 若F中有不屬於A1,…,An的屬性B1,…,Bm有更一般規則:

                   (σF(E ))≡              (σF (                            (E)))

6. 選擇與笛卡爾積的交換律

    1. 如果F中涉及的屬性都是E1中的屬性,則

          σF(EE2)≡σF(E1)×E2

    1. 如果F=F1∧F2,並且F1只涉及E1中的屬性,F2只涉及E2中的屬性,則由上面的等價變換規則1,4,6可推出:

          σF(EE2)≡    (E1)×    (E2)

    1. 若F1只涉及E1中的屬性,F2涉及E1和E2兩者的屬性,則仍有

          σF(EE2)≡       (      (E1)×E2)

             它使部分選擇在笛卡爾積前先做。

7. 選擇與並的分配律

        設E=E1∪E2,E1,E2有相同的屬性名,則

      σF(E1∪E2)≡σF(E1)∪σF(E2)

8. 選擇與差運算的分配律

        若E1與E2有相同的屬性名,則

      σF(E1-E2)≡σF(E1)-σF(E2)

9. 選擇對自然連線的分配律

    σF(E1     E2)≡σF(E1)    σF(E2)

F只涉及E1與E2的公共屬性

10. 投影與笛卡爾積的分配律

         設E1和E2是兩個關係表示式,A1,…,An是E1的屬性,  

      B1,…,Bm是E2的屬性,則

                          (EE2)≡            (E1)×             (E2)

11. 投影與並的分配律

         設E1和E2有相同的屬性名,則

                        (E1∪E2)≡            (E1)∪            (E2)

查詢樹的啟發式優化

  1. 典型的啟發式規則

(1)選擇運算應儘可能先做

     在優化策略中這是最重要、最基本的一條。

(2)把投影運算和選擇運算同時進行

如有若干投影和選擇運算,並且它們都對同一個關係操作,則可以在掃描此關係的同時完成所有的這些運算以避免重複掃描關係。

(3) 把投影同其前或其後的雙目運算結合起來,沒有必要為了去掉某些欄位而掃描一遍關係。

(4) 把某些選擇同在它前面要執行的笛卡爾積結合起來成為一個連線運算,連線特別是等值連線運算要比同樣關係上的笛卡爾積省很多時間。

(5) 找出公共子表示式

      1. 如果這種重複出現的子表示式的結果不是很大的關係
      2. 並且從外存中讀入這個關係比計算該子表示式的時間少得多
      3. 則先計算一次公共子表示式並把結果寫入中間檔案是合算的。
      4. 當查詢的是檢視時,定義檢視的表示式就是公共子表示式的情況
  1. 遵循這些啟發式規則,應用9.3.1的等價變換公式來優化關係表示式的演算法。

       演算法:關係表示式的優化

       輸入:一個關係表示式的查詢樹

       輸出:優化的查詢樹

方法:

       (1)利用等價變換規則4把形如σF1∧F2∧…∧Fn(E)變換為

              σF1(σF2(…(σFn(E))…))。

       (2)對每一個選擇,利用等價變換規則4~9儘可能把它

              移到樹的葉端。

(3)對每一個投影利用等價變換規則3,5,10,11中的一般形式儘可能把它移向樹的葉端。

    1. 注意:
      1. 等價變換規則3使一些投影消失或使一些投影出現
      2. 規則5把一個投影分裂為兩個,其中一個有可能被移向樹的葉端

    (4)利用等價變換規則3~5,把選擇和投影的串接合併成單個選擇、單個投影或一個選擇後跟一個投影,使多個選擇或投影能同時執行,或在一次掃描中全部完成

(5)把上述得到的語法樹的內節點分組。

    1. 每一雙目運算(×,  ,∪,-)和它所有的直接祖先為一組(這些直接祖先是(σ,π運算)。
    2. 如果其後代直到葉子全是單目運算,則也將它們併入該組
    3. 但當雙目運算是笛卡爾積(×),而且後面不是與它組成等值連線的選擇時,則不能把選擇與這個雙目運算組成同一組

9.4 物理優化

  1. 代數優化改變查詢語句中操作的次序和組合,不涉及底層的存取路徑
  2. 對於一個查詢語句有許多存取方案,它們的執行效率不同, 僅僅進行代數優化是不夠的
  3. 物理優化就是要選擇高效合理的操作演算法或存取路徑,求得優化的查詢計劃
  4. 物理優化方法
    1. 基於規則的啟發式優化
      1. 啟發式規則是指那些在大多數情況下都適用,但不是在每種情況下都是適用的規則。
    2. 基於代價估算的優化
      1. 優化器估算不同執行策略的代價,並選出具有最小代價的執行計劃。
  5. 物理優化方法(續)
    1. 兩者結合的優化方法:
      1. 常常先使用啟發式規則,選取若干較優的候選方案,減少代價估算的工作量
      2. 然後分別計算這些候選方案的執行代價,較快地選出最終的優化方案 
  6. 基於啟發式規則的存取路徑選擇優化
  7. 1.選擇操作的啟發式規則
  8. 2.連線操作的啟發式規則

1.選擇操作的啟發式規則

    1. 對於小關係,使用全表順序掃描,即使選擇列上有索引
    2. 對於大關係,啟發式規則有:

       (1)對於選擇條件是“主碼=值”的查詢

      1. 查詢結果最多是一個元組,可以選擇主碼索引
      2. 一般的關係資料庫管理系統會自動建立主碼索引

(2)對於選擇條件是“非主屬性=值”的查詢,並且選擇列上有索引

      1. 要估算查詢結果的元組數目
      2. 如果比例較小(<10%)可以使用索引掃描方法
      3. 否則還是使用全表順序掃描

(3)對於選擇條件是屬性上的非等值查詢或者範圍查詢,並且選擇列上有索引

    1. 要估算查詢結果的元組數目
      1. 如果比例較小(<10%)可以使用索引掃描方法
      2. 否則還是使用全表順序掃描

(4)對於用AND連線的合取選擇條件

    1. 如果有涉及這些屬性的組合索引
      1. 優先採用組合索引掃描方法
    2. 如果某些屬性上有一般的索引,可以用索引掃描方法
      1. 通過分別查詢滿足每個條件的指標,求指標的交集
      2. 通過索引查詢滿足部分條件的元組,然後在掃描這些元組時判斷是否滿足剩餘條件
    3. 其他情況:使用全表順序掃描

(5)對於用OR連線的析取選擇條件,一般使用全表順序掃描

2.連線操作的啟發式規則

  (1)如果2個表都已經按照連線屬性排序

    1. 選用排序-合併演算法

  (2)如果一個表在連線屬性上有索引

    1. 選用索引連線演算法

  (3)如果上面2個規則都不適用,其中一個表較小

    1. 選用Hash join演算法

(4)可以選用巢狀迴圈方法,並選擇其中較小的表,確切地講是佔用的塊數(b)較少的表,作為外表(外迴圈的表) 。

    理由:

    1. 設連線表R與S分別佔用的塊數為Br與Bs
    2. 連線操作使用的記憶體緩衝區塊數為K
    3. 分配K-1塊給外表
    4. 如果R為外表,則巢狀迴圈法存取的塊數為Br+BrBs/(K-1)
    5. 顯然應該選塊數小的表作為外表 

小 結

  1. 查詢處理是關係資料庫管理系統的核心,查詢優化技術是查詢處理的關鍵技術
  2. 本章主要內容
    1. 查詢處理過程
    2. 查詢優化
      1. 代數優化
      2. 物理優化
    3. 查詢執行
  3. 比較複雜的查詢,尤其是涉及連線和巢狀的查詢
    1. 不要把優化的任務全部放在關係資料庫管理系統上
    2. 應該找出關係資料庫管理系統的優化規律,以寫出適合關係資料庫管理系統自動優化的SQL語句
    3. 對於關係資料庫管理系統不能優化的查詢需要重寫查詢語句,進行手工調整以優化效能