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


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

程序語言的執行過程
一段C程序、Python程序是如何在計算機上執行的?
image-20210922103137500

主要學習目標

SQL查詢過程
查詢代價估算

一 概述

1.1 查詢處理過程
查詢處理的基本環節及各自的任務? 
什么是查詢執行計划? 

image-20210922103348248

1.2 查詢代價的度量
影響查詢執行效率的主要因素? 

image-20210922103544923

二、 選擇操作的實現

[例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 涉及等值比較的選擇

如何有效執行選擇操作? 
image-20210922104241040
各種等值比較情況的執行開銷分析
image-20210922104434492
2.2 涉及范圍比較的選擇
如何執行涉及比較范圍的選擇操作? 

image-20210922104527748

三、 連接操作的實現

連接操作是查詢處理中最耗時的操作之一。

只討論等值連接(或自然連接)最常用的實現算法。

[例2]   SELECT * FROM Student,SC 		      
            WHERE Student.Sno=SC.Sno; 
image-20210922104805808
  • 嵌套循環方法(nested loop)
  • 排序-合並方法(sort-merge join 或merge join)
  • 索引連接(index join)方法
  • Hash Join方法

1、嵌套循環方法(nested loop)

  • 對外層循環(Student)的每一個元組(s),檢索內層循環(SC)中的每一個元組(sc);
  • 檢查這兩個元組在連接屬性(sno)上是否相等;
  • 如果滿足連接條件,則串接后作為結果輸出,直到外層循環表中的元組處理完為止 。
image-20210922105004655

2、排序-合並方法(sort-merge join 或merge join)

  • 適合連接的各表已經排好序的情況

  • 排序-合並連接方法的步驟:

如果連接的表沒有排好序,先對Student表和SC表按連接屬性Sno排序 ;

取Student表中第一個Sno,依次掃描SC表中具有相同Sno的元組 ;

image-20210922105202511 image-20210922105300886

排序-合並連接方法的步驟(續):

  • 當掃描到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並與之相匹配的元組連接起來。

image-20210922110009663 image-20210922110024548

上面hash join算法前提:假設兩個表中較小的表在第一階段后可以完全放入內存的hash桶中 。

以上的算法思想可以推廣到更加一般的多個表的連接算法上 。

四 表達式計算(SQL查詢)

1.(表達式計算中的)物化計算
討論4. 表達式(復合操作)的計算如何執行?
1) 什么是物化,主要作用?
image-20210922110158957
2.(表達式計算中的)流水線計算
2) 什么是流水線,主要作用?
3) 流水線的執行過程?
image-20210922112326488 image-20210922112419240
一條SQL語句要經歷哪些步驟才能被數據庫執行?
兩個表的連接操作有幾種實現方法?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM