hello大家好,好久不見!今天我們的《教妹學數據庫系統》來學習數據庫系統中的查詢執行:排序、選擇、去重、聚集、集合差和集合並操作。教妹學數據庫,沒見過這麼酷炫的標題吧?“語不驚人死不休”,沒錯,標題就是這麼酷炫。
我的妹妹小埋18歲,校園中女神一般的存在,成績優異體育萬能,個性溫柔正直善良。然而,只有我知道,衆人眼中光芒萬丈的小埋,在過去是一個披着倉鼠斗篷,滿地打滾,除了喫就是睡和玩的超級宅女。而這一切的轉變,是從那一天晚上開始的。
從此之後,小埋經常讓我幫她輔導功課。今天她想了解數據庫系統中的查詢執行。本篇教程通過我與小埋的對話的方式來談一談排序、選擇、去重、聚集、集合差和集合並操作操作。
排序操作
創建歸併段(CreateRuns)
將關係R劃分的歸併段數爲:
過程:
for R的每M塊 do
將這M塊讀入緩衝池中M頁
對這M頁中的元組按排序鍵(sortkey)進行排序,形成歸併段(run)
將該歸併段寫入文件
多路歸併
將 個歸併段中的元組進行歸併
過程:
將每個歸併段的第1塊讀入緩衝池的1頁
repeat
找出所有輸入緩衝頁中最小的排序鍵值v
將所有排序鍵值等於v的元組寫入輸出緩衝區
任意輸入緩衝頁中的元組若歸併完畢,則讀入其歸併段的下一頁
until 所有歸併段都已歸併完畢
算法分析
分析算法時不考慮結果輸出操作
-
輸出結果時產生的I/O不計入算法的I/O代價。輸出結果可能直接作爲後續操作的輸入,無需寫入文件
-
輸出緩衝區不計入可用內存頁數。如果輸出結果直接作爲後續操作的輸入,那麼輸出緩衝區將計入後續操作的可用內存頁數
I/O代價: 3B( R )
- 在創建歸併段時,R的每塊讀1次,合計B( R )次I/O
- 將每個歸併段寫入文件,合計B( R )次I/O。在歸併階段,每個歸併段掃描1次,合計B( R )次I/O
可用內存頁數要求: B( R) ≤
- 每個歸併段不超過M頁
- 最多M個歸併段
多趟多路外存歸併排序
若B( R )>,則需要執行多趟多路外存歸併排序
- I/O代價是(2m−1)B( R ),其中m算法執行的趟數
多路歸併排序的優化:當某緩衝頁中所有元組都已歸併完畢,DBMS需讀入其歸併段的下一塊此時,歸併進程被掛起(suspend),直至I/O完成。
雙緩衝(DoubleBuffering)
爲每個歸併段分配多個內存頁作爲輸入緩衝區,並組成環形(circular)
-
在當前緩衝頁中所有元組都已歸併完畢時,DBMS直接開始歸併下一緩衝頁中的元組
-
與此同時,DBMS將歸併段文件的下一塊讀入空閒的緩衝頁
選擇操作
塊數 (外存),即是頁數(緩衝池)
B( R )/V(R,K)指每個不同值的平均塊數
基於掃描的選擇算法(Scanning-basedSelection)
for R的每一塊P do
將P讀入緩衝池
for P中每條元組t do
if t滿足選擇條件
then 將t寫入輸出緩衝區
算法分析
I/O代價: B( R )(R採用聚簇存儲)
- R的元組連續存儲於文件中
- R的每塊只讀1次
I/O代價: T( R )(R不採用聚簇存儲)
- R的元組不連續存儲於文件中
- 最壞情況下,R的元組均在不同頁上
可用內存頁數要求:M≥1
- 至少需要1頁作爲緩衝區,用於讀R的每一塊
基於哈希的選擇算法(Hash-basedSelection)
算法
-
根據hash(v)確定結果元組所在的桶
-
在桶頁面中搜索鍵值等於v的元組,並將元組寫入輸出緩衝區
算法分析
- I/O代價 ≈ B( R )/V(R,K)
- 屬性K有V(R,K)個不同的值
- 每個桶平均有B( R )/V(R,K)個頁(很不準確的估計)
- 可用內存頁數要求:M≥1
- 至少需要1頁作爲緩衝區,用於讀桶的每一頁
基於索引的選擇算法(Index-basedSelection)
使用該算法的前提條件
- 選擇條件的形式是K=v或l≤K≤u
- 關係R上建有屬性K的索引
在索引上搜索滿足選擇條件的元組,並將元組寫入輸出緩衝區
算法分析
- I/O代價≈B( R )/V(R,K)(如果索引是聚簇索引)
- 結果元組連續存儲於文件中
- 屬性K有V(R,K)個不同的值
- 結果元組約佔B( R )/V(R,K)個頁(很不準確的估計)
- I/O代價≈T( R )/V(R,K)(如果索引是非聚簇索引)
- 約有T( R )/V(R,K)個結果元組(很不準確的估計)
- 結果元組不一定連續存儲於文件中
- 最壞情況下,所有結果元組均在不同頁上
- 可用內存頁數要求: M ≥ 1
- 至少需要1頁作爲緩衝區,用於讀B+樹的節點
去重操作
不帶去重的投影算法
算法分析
- I/O代價: B( R )(R採用聚簇存儲)
- R的元組連續存儲於文件中
- R的每塊只讀1次
- I/O代價: T( R )(R不採用聚簇存儲)
- R的元組不連續存儲於文件中
- 最壞情況下,R的元組均在不同頁上
- 可用內存頁數要求: M ≥ 1
- 至少需要1頁作爲緩衝區,用於讀R的每一塊
一趟去重算法(One-PassDuplicateElimination)
算法
for R的每一塊P do
將P讀入緩衝池
for P中每條元組t do
if未見過 tthen
將t寫入輸出緩衝區
算法分析
該算法在數據訪問模式上與基於掃描的選擇算法相同
- I/O代價: B( R )(R採用聚簇存儲)
- R的元組連續存儲於文件中
- R的每塊只讀1次
- I/O代價: T( R )(R不採用聚簇存儲)
- R的元組不連續存儲於文件中
- 最壞情況下,R的元組均在不同頁上
- 可用內存頁數要求: B(δ( R ))≤M−1
R中互不相同的元組δ( R )必須能在M−1頁中存得下
基於排序的去重算法(Sort-basedDuplicateElimination)
基於排序的去重算法與多路歸併排序(multiwaymergesort)算法本質上一樣,兩點區別如下:
-
在創建歸併段(run)時,按整個元組進行排序
-
在歸併階段,相同元組只輸出1個,其他全部丟棄
算法分析
- I/O代價:3B( R )
- 在創建歸併段時,R的每塊讀1次,合計B( R )次I/O
- 將每個歸併段寫入文件,合計B( R )次I/O
- 在歸併階段,每個歸併段掃描1次,合計B( R )次I/O
- 可用內存頁數要求: B( R ) ≤
每個歸併段不超過M頁
最多M個歸併段
基於哈希的去重算法(Hash-basedDuplicateElimination)
逐桶去重的原因:可能重複的元素一定在一個桶中,哈希的過程已經分開了
每個桶 Ri 的去重結果放在一起就得到了R的去重結果
實例
算法分析
- I/O代價:3B( R )
在哈希分桶時,R的每塊讀1次,合計B( R )次I/O
將每個桶寫入文件
在每個桶Ri上執行一趟去重算法的I/O代價是B(Ri)
- 可用內存頁數要求: B( R ) ≤
-
共M−1個桶
-
每個桶不超過M−1塊,因此在每個桶上執行一趟去重算法時,可用內存頁數滿足要求
聚集操作
聚集操作和去重操作的執行在本質上一樣
-
方法1:一趟聚集算法(One-passAggregation)
-
方法2:基於排序的聚集算法(Sort-basedAggregation)
-
方法3:基於哈希的聚集算法(Hash-basedAggregation)
集合差操作
一趟集合差算法(One-PassSetDifference)
算法
實例
算法分析
- I/O代價: B( R )+B(S)
在構建(build)階段,S的每塊只讀1次,合計B(S)次I/O
在探測(probe)階段,R的每塊只讀1次,合計B( R )次I/O
- 可用內存頁數要求:B(S) ≤ M−1
- 內存查找結構約佔B(S)頁
基於哈希的集合差算法
算法:
1: //哈希分桶(與基於哈希的去重算法的分桶方法相同)
2: 將R的元組哈希到M−1個桶R1,R2,...,RM−1中(哈希鍵爲整個元組)
3: 將S的元組哈希到M−1個桶S1,S2,...,SM−1中(哈希鍵爲整個元組)
4: //逐桶計算集合差
5: for i=1,2,...,M−1 do
使用一趟集合差(one-passsetdifference)算法計算Ri−Si,並將結果寫入輸出緩衝區
算法分析
I/O代價: 3B®+3B(S)
- 在對R進行哈希分桶時,R的每塊讀1次,合計B( R )次I/O
- 將R的桶全部寫入文件,需≈B( R )次I/O
- 在對S進行哈希分桶時,S的每塊讀1次,合計B(S)次I/O
- 將S的桶全部寫入文件,需≈B(S)次I/O
- 使用一趟集合差算法計算Ri−Si的I/O代價是B( Ri )+B(Si)
可用內存頁數要求: B(S)≤
-
S共有M−1個桶
-
S的每個桶不超過M−1塊
可用內存頁數不受R的要求
基於排序的集合差算法
算法
1://創建歸併段
2:將R劃分爲dB(R)/Me個歸併段(每個歸併段按整個元組進行排序)
3:將S劃分爲dB(S)/Me個歸併段(每個歸併段按整個元組進行排序)
4://歸併
5:讀入R和S的每個歸併段的第1頁
6:repeat
找出輸入緩衝區中最小的元組t
if t∈R且t ∈/ S then
將t寫入輸出緩衝區
從輸入緩衝區中刪除t的所有副本
任意輸入緩衝頁中的元組若歸併完畢,則讀入其歸併段的下一頁
until R的所有歸併段都已歸併完畢
算法分析
I/O代價:3B( R )+3B(S)
-
在對R創建歸併段時,R的每塊只讀1次,合計B( R )次I/O
-
將R的歸併段全部寫入文件,需B( R )次I/O
-
在對S創建歸併段時,S的每塊只讀1次,合計B(S)次I/O
-
將S的歸併段全部寫入文件,需B(S)次I/O
-
在歸併階段,對R和S的每個歸併段各掃描1次,合計B( R )+B(S)次I/O
可用內存頁數要求:B( R )+B(S) ≤ -
R和S的每個歸併段均不超過M塊
-
R和S共有不超過M個歸併段
集合並操作
集合並操作和集合差操作的執行在本質上一樣
- 方法1:一趟集合並算法(One-passSetUnion)
- 方法2:基於排序的集合並算法(Sort-basedSetUnion)
- 方法3:基於哈希的集合並算法(Hash-basedSetUnion)
總結
咱們玩歸玩,鬧歸鬧,別拿學習開玩笑。
本篇介紹了查詢執行的五大 “法寶” 操作:排序、選擇、去重、聚集、集合差和集合並操作。學習時要注重抓住各大操作的原理和本質,比如聚集操作和去重操作的本質上是一樣的,學會了去重操作便可觸類旁通,知道聚集操作如何執行。每個操作有多種算法,根據算法分析的結果可以明顯看出不同算法的優缺點和適應場景。