(教妹學數據庫系統)(九)查詢執行

hello大家好,好久不見!今天我們的《教妹學數據庫系統》來學習數據庫系統中的查詢執行:排序、選擇、去重、聚集、集合差和集合並操作。教妹學數據庫,沒見過這麼酷炫的標題吧?“語不驚人死不休”,沒錯,標題就是這麼酷炫。

我的妹妹小埋18歲,校園中女神一般的存在,成績優異體育萬能,個性溫柔正直善良。然而,只有我知道,衆人眼中光芒萬丈的小埋,在過去是一個披着倉鼠斗篷,滿地打滾,除了喫就是睡和玩的超級宅女。而這一切的轉變,是從那一天晚上開始的。

從此之後,小埋經常讓我幫她輔導功課。今天她想了解數據庫系統中的查詢執行。本篇教程通過我與小埋的對話的方式來談一談排序、選擇、去重、聚集、集合差和集合並操作操作

排序操作

在這裏插入圖片描述

創建歸併段(CreateRuns)

將關係R劃分的歸併段數爲: \lceilBR)M\frac{B(R))}{M}\rceil

過程:

for R的每M塊 do
	將這M塊讀入緩衝池中M頁
	對這M頁中的元組按排序鍵(sortkey)進行排序,形成歸併段(run)
	將該歸併段寫入文件

多路歸併

\lceilBR)M\frac{B(R))}{M}\rceil 個歸併段中的元組進行歸併

過程:

將每個歸併段的第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) ≤ M2M^2

  • 每個歸併段不超過M頁
  • 最多M個歸併段

多趟多路外存歸併排序

若B( R )>M2M^2,則需要執行多趟多路外存歸併排序

  • 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)

算法

  1. 根據hash(v)確定結果元組所在的桶

  2. 在桶頁面中搜索鍵值等於v的元組,並將元組寫入輸出緩衝區

在這裏插入圖片描述

算法分析

  1. I/O代價 ≈ B( R )/V(R,K)
  • 屬性K有V(R,K)個不同的值
  • 每個桶平均有B( R )/V(R,K)個頁(很不準確的估計)
  1. 可用內存頁數要求:M≥1
  • 至少需要1頁作爲緩衝區,用於讀桶的每一頁

基於索引的選擇算法(Index-basedSelection)

使用該算法的前提條件

  • 選擇條件的形式是K=v或l≤K≤u
  • 關係R上建有屬性K的索引

在索引上搜索滿足選擇條件的元組,並將元組寫入輸出緩衝區

算法分析

  1. I/O代價≈B( R )/V(R,K)(如果索引是聚簇索引)
  • 結果元組連續存儲於文件中
  • 屬性K有V(R,K)個不同的值
  • 結果元組約佔B( R )/V(R,K)個頁(很不準確的估計)
  1. I/O代價≈T( R )/V(R,K)(如果索引是非聚簇索引)
  • 約有T( R )/V(R,K)個結果元組(很不準確的估計)
  • 結果元組不一定連續存儲於文件中
  • 最壞情況下,所有結果元組均在不同頁上
  1. 可用內存頁數要求: M ≥ 1
  • 至少需要1頁作爲緩衝區,用於讀B+樹的節點

去重操作

不帶去重的投影算法

在這裏插入圖片描述

算法分析

  1. I/O代價: B( R )(R採用聚簇存儲)
  • R的元組連續存儲於文件中
  • R的每塊只讀1次
  1. I/O代價: T( R )(R不採用聚簇存儲)
  • R的元組不連續存儲於文件中
  • 最壞情況下,R的元組均在不同頁上
  1. 可用內存頁數要求: M ≥ 1
  • 至少需要1頁作爲緩衝區,用於讀R的每一塊

一趟去重算法(One-PassDuplicateElimination)

算法

 for R的每一塊P do
      將P讀入緩衝池
      for P中每條元組t do
	      if未見過 tthen
	      	將t寫入輸出緩衝區

在這裏插入圖片描述

算法分析

該算法在數據訪問模式上與基於掃描的選擇算法相同

  1. I/O代價: B( R )(R採用聚簇存儲)
  • R的元組連續存儲於文件中
  • R的每塊只讀1次
  1. I/O代價: T( R )(R不採用聚簇存儲)
  • R的元組不連續存儲於文件中
  • 最壞情況下,R的元組均在不同頁上
  1. 可用內存頁數要求: B(δ( R ))≤M−1
    R中互不相同的元組δ( R )必須能在M−1頁中存得下

基於排序的去重算法(Sort-basedDuplicateElimination)

基於排序的去重算法與多路歸併排序(multiwaymergesort)算法本質上一樣,兩點區別如下:

  • 在創建歸併段(run)時,按整個元組進行排序

  • 在歸併階段,相同元組只輸出1個,其他全部丟棄

算法分析

  1. I/O代價:3B( R )
  • 在創建歸併段時,R的每塊讀1次,合計B( R )次I/O
  • 將每個歸併段寫入文件,合計B( R )次I/O
  • 在歸併階段,每個歸併段掃描1次,合計B( R )次I/O
  1. 可用內存頁數要求: B( R ) ≤ M2M^2
    每個歸併段不超過M頁
    最多M個歸併段

基於哈希的去重算法(Hash-basedDuplicateElimination)

在這裏插入圖片描述

逐桶去重的原因:可能重複的元素一定在一個桶中,哈希的過程已經分開了

在這裏插入圖片描述
每個桶 Ri 的去重結果放在一起就得到了R的去重結果
在這裏插入圖片描述

實例

在這裏插入圖片描述

算法分析

  1. I/O代價:3B( R )

在哈希分桶時,R的每塊讀1次,合計B( R )次I/O

將每個桶寫入文件
在這裏插入圖片描述
在每個桶Ri上執行一趟去重算法的I/O代價是B(Ri)

  1. 可用內存頁數要求: B( R ) ≤ (M1)2(M−1)^2
  • 共M−1個桶

  • 每個桶不超過M−1塊,因此在每個桶上執行一趟去重算法時,可用內存頁數滿足要求

聚集操作

聚集操作和去重操作的執行在本質上一樣

  • 方法1:一趟聚集算法(One-passAggregation)

  • 方法2:基於排序的聚集算法(Sort-basedAggregation)

  • 方法3:基於哈希的聚集算法(Hash-basedAggregation)

集合差操作

一趟集合差算法(One-PassSetDifference)

在這裏插入圖片描述

算法

在這裏插入圖片描述

實例

在這裏插入圖片描述

算法分析

  1. I/O代價: B( R )+B(S)

在構建(build)階段,S的每塊只讀1次,合計B(S)次I/O
在探測(probe)階段,R的每塊只讀1次,合計B( R )次I/O

  1. 可用內存頁數要求: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)≤(M1)2(M−1)^2

  • S共有M−1個桶

  • S的每個桶不超過M−1塊

可用內存頁數不受R的要求

基於排序的集合差算法

算法

1://創建歸併段
2:將R劃分爲dB(R)/Me個歸併段(每個歸併段按整個元組進行排序)
3:將S劃分爲dB(S)/Me個歸併段(每個歸併段按整個元組進行排序)
4://歸併
5:讀入R和S的每個歸併段的第16: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) ≤ M2M^2

  • R和S的每個歸併段均不超過M塊

  • R和S共有不超過M個歸併段

集合並操作

集合並操作和集合差操作的執行在本質上一樣

  • 方法1:一趟集合並算法(One-passSetUnion)
  • 方法2:基於排序的集合並算法(Sort-basedSetUnion)
  • 方法3:基於哈希的集合並算法(Hash-basedSetUnion)

總結

咱們玩歸玩,鬧歸鬧,別拿學習開玩笑。

本篇介紹了查詢執行的五大 “法寶” 操作:排序、選擇、去重、聚集、集合差和集合並操作。學習時要注重抓住各大操作的原理和本質,比如聚集操作和去重操作的本質上是一樣的,學會了去重操作便可觸類旁通,知道聚集操作如何執行。每個操作有多種算法,根據算法分析的結果可以明顯看出不同算法的優缺點和適應場景。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章