第三章 查詢處理(基本操作的實現)
程序語言的執行過程
一段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語句要經歷哪些步驟才能被數據庫執行?
兩個表的連接操作有幾種實現方法?