1. 程式人生 > 其它 >【資料庫下】 第三章 查詢處理(基本操作的實現)

【資料庫下】 第三章 查詢處理(基本操作的實現)

第三章 查詢處理(基本操作的實現)

程式語言的執行過程
一段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語句要經歷哪些步驟才能被資料庫執行?
兩個表的連線操作有幾種實現方法?