【資料庫下】 第三章 查詢處理(基本操作的實現)
第三章 查詢處理(基本操作的實現)
程式語言的執行過程
一段C程式、Python程式是如何在計算機上執行的?
主要學習目標
SQL查詢過程
查詢代價估算
一 概述
1.1 查詢處理過程
查詢處理的基本環節及各自的任務?
什麼是查詢執行計劃?
1.2 查詢代價的度量
影響查詢執行效率的主要因素?
二、 選擇操作的實現
[例1]Select * from student where <條件表示式> ; 考慮<條件表示式>的幾種情況: C1:無條件 C2:Sno='200215121' C3:Sage>20 C4:Sdept='CS' AND Sage>20
選擇操作典型實現方法:
1、簡單的全表掃描方法
- 對查詢的基本表順序掃描,逐一檢查每個元組是否滿足選擇條件,把滿足條件的元組作為結果輸出;
- 適合小表,不適合大表。
2、索引(或雜湊)掃描方法
- 適合在選擇條件中的屬性上有索引;
(例如B+樹索引或Hash索引) - 通過索引先找到滿足條件的元組主碼或元組指標,再通過元組指標直接在查詢的基本表中找到元組。
[例1-C2] 以C2為例,Sno=‘200215121’,並且Sno上有 索引(或Sno是雜湊碼): 使用索引(或雜湊)得到Sno為‘200215121’ 元組的指標; 通過元組指標在student表中檢索到該學生。 [例1-C3] 以C3為例,Sage>20,並且Sage 上有B+樹索引: 使用B+樹索引找到Sage=20的索引項,以此為入口點在B+樹的順序集上得到Sage>20的所有元組指標; 通過這些元組指標到student表中檢索到所有年齡大於20的學生。
[例1-C4] 以C4為例,Sdept=‘CS’ AND Sage>20,
如果在Sdept和Sage上都有索引:
演算法一:分別用上面兩種方法分別找到Sdept=‘CS’的一組元組指標和Sage>20的另一組元組指標。
求這2組指標的交集
到student表中檢索
得到計算機系年齡大於20的學生
演算法二:找到Sdept=‘CS’的一組元組指標。
通過這些元組指標到student表中檢索
對得到的元組檢查另一些選擇條件(如Sage>20)是否滿足
把滿足條件的元組作為結果輸出
2.1 涉及等值比較的選擇
如何有效執行選擇操作?
各種等值比較情況的執行開銷分析
2.2 涉及範圍比較的選擇
如何執行涉及比較範圍的選擇操作?
三、 連線操作的實現
連線操作是查詢處理中最耗時的操作之一。
只討論等值連線(或自然連線)最常用的實現演算法。
[例2] SELECT * FROM Student,SC
WHERE Student.Sno=SC.Sno;
- 巢狀迴圈方法(nested loop)
- 排序-合併方法(sort-merge join 或merge join)
- 索引連線(index join)方法
- Hash Join方法
1、巢狀迴圈方法(nested loop)
- 對外層迴圈(Student)的每一個元組(s),檢索內層迴圈(SC)中的每一個元組(sc);
- 檢查這兩個元組在連線屬性(sno)上是否相等;
- 如果滿足連線條件,則串接後作為結果輸出,直到外層迴圈表中的元組處理完為止 。
2、排序-合併方法(sort-merge join 或merge join)
-
適合連線的各表已經排好序的情況
-
排序-合併連線方法的步驟:
如果連線的表沒有排好序,先對Student表和SC表按連線屬性Sno排序 ;
取Student表中第一個Sno,依次掃描SC表中具有相同Sno的元組 ;
排序-合併連線方法的步驟(續):
- 當掃描到Sno不相同的第一個SC元組時,返回Student表掃描它的下一個元組,再掃描SC表中具有相同Sno的元組,把它們連線起來;
- 重複上述步驟直到Student表掃描完。
Student表和SC表都只要掃描一遍;
如果2個表原來無序,執行時間要加上對兩個表的排序時間;
對於2個大表,先排序後使用sort-merge join方法執行連線,總的時間一般會大大減少。
總的傳輸塊數:br+bs
3、索引連線(index join)方法
步驟:
① 在SC表上建立屬性Sno的索引,如果原來沒有該索引;
② 對Student中每一個元組,由Sno值通過SC的索引查詢相應的SC元組;
③ 把這些SC元組和Student元組連線起來;
迴圈執行②③,直到Student表中的元組處理完為止 。
4、 Hash Join方法
把連線屬性作為hash碼,用同一個hash函式把R和S中的元組雜湊到“同一個”hash桶中。
步驟:
劃分階段(partitioning phase):
對包含較少元組的表(比如R)進行一遍處理;
把它的元組按hash函式分散到hash表的桶中。
試探階段(probing phase):也稱為連線階段(join phase)
對另一個表S進行一遍處理;
把S的元組雜湊到適當的hash桶中;
把元組與桶中所有來自R並與之相匹配的元組連線起來。
上面hash join演算法前提:假設兩個表中較小的表在第一階段後可以完全放入記憶體的hash桶中 。
以上的演算法思想可以推廣到更加一般的多個表的連線演算法上 。
四 表示式計算(SQL查詢)
1.(表示式計算中的)物化計算
討論4. 表示式(複合操作)的計算如何執行?
1) 什麼是物化,主要作用?
2.(表示式計算中的)流水線計算
2) 什麼是流水線,主要作用?
3) 流水線的執行過程?
一條SQL語句要經歷哪些步驟才能被資料庫執行?
兩個表的連線操作有幾種實現方法?