資料庫系統概論(第九章: 關係查詢處理和查詢優化)
第9章 關係查詢處理和查詢優化
查詢優化分類 :
代數優化:指關係代數表示式的優化
物理優化:指存取路徑和底層操作演算法的選擇
9.1 關係資料庫系統的查詢處理
9.1.1 查詢處理步驟
※關係資料庫管理系統查詢處理階段 :
1. 查詢分析
2. 查詢檢查
3. 查詢優化
4. 查詢執行
9.1.2 實現查詢操作的演算法示例
1.選擇操作的實現
※選擇操作典型實現方法:
(1) 全表掃描方法 (Table Scan)
●對查詢的基本表順序掃描,逐一檢查每個元組是否滿足選擇條件,把滿足條件的元組作為結果輸出
●適合小表,不適合大表
(2)索引掃描方法 (Index Scan)
●適合於選擇條件中的屬性上有索引(例如B+樹索引或Hash索引)
●通過索引先找到滿足條件的元組主碼或元組指標,再通過元組指標直接在查詢的基本表中找到元組
※全表掃描演算法
●假設可以使用的記憶體為M塊,全表掃描演算法思想:
① 按照物理次序讀Student的M塊到記憶體
②檢查記憶體的每個元組t,如果滿足選擇條件,則輸出t
③如果student還有其他塊未被處理,重複①和②
※索引掃描演算法
2.連線操作的實現
※連線操作是查詢處理中最耗時的操作之一
9.2
※查詢優化在關係資料庫系統中有著非常重要的地位
※關係查詢優化是影響關係資料庫管理系統效能的關鍵因素
※由於關係表示式的語義級別很高,使關係系統可以從關係表示式中分析查詢語義,提供了執行查詢優化的可能性
9.2.1查詢優化概述
※關係系統的查詢優化
●是關係資料庫管理系統實現的關鍵技術又是關係系統的優點所在
●減輕了使用者選擇存取路徑的負擔
※關係資料庫管理系統通過某種代價模型計算出各種查詢執行策略的執行代價,然後選取代價最小的執行方案
●集中式資料庫
⊙ 執行開銷主要包括
↣磁碟存取塊數(I/O代價)
↣處理機時間(CPU代價)
↣查詢的記憶體開銷
⊙ I/O代價是最主要的
●分散式資料庫
⊙總代價=I/O代價+CPU代價+記憶體代價+通訊代價
※查詢優化的總目標
●選擇有效的策略
●求得給定關係表示式的值
●使得查詢代價最小(實際上是較小)
9.2.2一個例項
※一個關係查詢可以對應不同的執行方案,其效率可能相差非常大。
※可以用多種等價的關係代數表示式來完成這一查詢
●Q1=πSname(σStudent.Sno=SC.Sno∧SC.Cno='2' (Student×SC))
●Q2=πSname(σSC.Cno='2' (Student SC))
●Q3=πSname(Student σSC.Cno='2'(SC))
1.第一種情況
●Q1=πSname(σStudent.Sno=SC.Sno∧SC.Cno='2' (Student×SC))
(1) 計算廣義笛卡爾積
※演算法:
●在記憶體中儘可能多地裝入某個表(如Student表)的若干塊,留出一塊存放另一個表(如SC表)的元組。
●把SC中的每個元組和Student中每個元組連線,連線後的元組裝滿一塊後就寫到中間檔案上
●從SC中讀入一塊和記憶體中的Student元組連線,直到SC表處理完。
●再讀入若干塊Student元組,讀入一塊SC元組
●重複上述處理過程,直到把Student表處理完
※設一個塊能裝10個Student元組或100個SC元組,在記憶體中存放5塊Student元組和1塊SC元組,則讀取總塊數為
●讀Student表100塊,讀SC表20遍,每遍100塊,則總計要讀取2100資料塊。
●連線後的元組數為103×104=107。設每塊能裝10個元組,則寫出106 塊。
(2)作選擇操作
●依次讀入連線後的元組,按照選擇條件選取滿足要求的記錄
●假定記憶體處理時間忽略。讀取中間檔案花費的時間(同寫中間檔案一樣)需讀入106塊。
●若滿足條件的元組假設僅50個,均可放在記憶體。
(3)作投影操作
●把第(2)步的結果在Sname上作投影輸出,得到最終結果
※第一種情況下執行查詢的總讀寫資料塊=2100+106 +106
2.第二種情況
Q2=πSname(σSc.Cno='2' (Student SC))
(1)計算自然連線
●執行自然連線,讀取Student和SC表的策略不變,總的讀取塊數仍為2100塊
●自然連線的結果比第一種情況大大減少,為104個元組
●寫出資料塊= 103 塊
(2)讀取中間檔案塊,執行選擇運算,讀取的資料塊=
103 塊
(3)把第2步結果投影輸出。
●第二種情況下執行查詢的總讀寫資料塊=2100+ 103 +103
●其執行代價大約是第一種情況的488分之一
3.第三種情況
Q3=πSname(Student σSC.Cno='2'(SC))
(1)先對SC表作選擇運算,只需讀一遍SC表,存取
100塊,因為滿足條件的元組僅50個,不必使用中
間檔案。
(2)讀取Student表,把讀入的Student元組和記憶體中
的SC元組作連線。也只需讀一遍Student表共100
塊。
(3)把連線結果投影輸出
●第三種情況總的讀寫資料塊=100+100
●其執行代價大約是第一種情況的萬分之一,是第二種情況的20分之一
※假如SC表的Cno欄位上有索引
●第一步就不必讀取所有的SC元組而只需讀取Cno=‘2’的那些元組(50個)
●存取的索引塊和SC中滿足條件的資料塊大約總共3~4塊
※若Student表在Sno上也有索引
●不必讀取所有的Student元組
●因為滿足條件的SC記錄僅50個,涉及最多50個Student記錄
●讀取Student表的塊數也可大大減少
※把代數表示式Q1變換為Q2、 Q3
Q1=πSname(σStudent.Sno=SC.Sno∧Sc.Cno='2' (Student×SC))
Q2=πSname(σSc.Cno='2' (Student SC))
Q3=πSname(Student σSC.Cno='2'(SC))
●有選擇和連線操作時,先做選擇操作,這樣參加連線的元組就可以大大減少,這是代數優化。
※在Q3中
●SC表的選擇操作演算法有全表掃描或索引掃描,經過初步估算,索引掃描方法較優。
●對於Student和SC表的連線,利用Student表上的索引,採用索引連線代價也較小,這就是物理優化。
9.3
9.3.1 關係代數表示式等價變換規則
※代數優化策略:通過對關係代數表示式的等價變換來提高查詢效率
※關係代數表示式的等價:指用相同的關係代替兩個表示式中相應的關係所得到的結果是相同的
※兩個關係表示式E1和E2是等價的,可記為E1≡E2
※常用的等價變換規則:
1.連線、笛卡爾積交換律
2.連線、笛卡爾積的結合律
3.投影的串接定律
4.選擇的串接定律
5.選擇與投影操作的交換律
6. 選擇與笛卡爾積的交換律
7. 選擇與並的分配律
8. 選擇與差運算的分配律
9. 選擇對自然連線的分配律
10. 投影與笛卡爾積的分配律
11. 投影與並的分配律
9.3.2 查詢樹的啟發式優化
※典型的啟發式規則
(1)選擇運算應儘可能先做
在優化策略中這是最重要、最基本的一條。
(2)把投影運算和選擇運算同時進行
如有若干投影和選擇運算,並且它們都對同一個關係操作,則可以在掃描此關係的同時完成所有的這些運算以避免重複掃描關係。
(3) 把投影同其前或其後的雙目運算結合起來,沒有必要為了去掉某些欄位而掃描一遍關係。
(4) 把某些選擇同在它前面要執行的笛卡爾積結合起來成為一個連線運算,連線特別是等值連線運算要比同樣關係上的笛卡爾積省很多時間。
(5) 找出公共子表示式
●如果這種重複出現的子表示式的結果不是很大的關係
●並且從外存中讀入這個關係比計算該子表示式的時間少得多
●則先計算一次公共子表示式並把結果寫入中間檔案是合算的。
●當查詢的是檢視時,定義檢視的表示式就是公共子表示式的情況
●注意:
等價變換規則3使一些投影消失或使一些投影出現
規則5把一個投影分裂為兩個,其中一個有可能被移向樹的葉端
規則3: 合併或分解投影運算
規則5,10,11:投影運算與其他運算交換
規則3:合併或分解投影運算
規則4:合併或分解選擇運算
規則5:投影運算與選擇運算交換
9.4 物理優化
※代數優化改變查詢語句中操作的次序和組合,不涉及底層的存取路徑
※對於一個查詢語句有許多存取方案,它們的執行效率不同, 僅僅進行代數優化是不夠的
※物理優化就是要選擇高效合理的操作演算法或存取路徑,求得優化的查詢計劃
※物理優化方法
●基於規則的啟發式優化
⊙啟發式規則是指那些在大多數情況下都適用,但不是在每種情況下都是適用的規則。
●基於代價估算的優化
⊙優化器估算不同執行策略的代價,並選出具有最小代價的執行計劃。
●兩者結合的優化方法:
⊙常常先使用啟發式規則,選取若干較優的候選方案,減少代價估算的工作量
⊙然後分別計算這些候選方案的執行代價,較快地選出最終的優化方案
9.4.1 基於啟發式規則的存取路徑選擇優化
1.選擇操作的啟發式規則
●對於小關係,使用全表順序掃描,即使選擇列上有索引
●對於大關係,啟發式規則有:
(1)對於選擇條件是“主碼=值”的查詢
⊙查詢結果最多是一個元組,可以選擇主碼索引
⊙一般的關係資料庫管理系統會自動建立主碼索引
(2)對於選擇條件是“非主屬性=值”的查詢,並且選擇列上有索引
⊙要估算查詢結果的元組數目
⊙如果比例較小(<10%)可以使用索引掃描方
⊙法
否則還是使用全表順序掃描
(3)對於選擇條件是屬性上的非等值查詢或者範圍查詢,並且選擇列上有索引
●要估算查詢結果的元組數目
⊙如果比例較小(<10%)可以使用索引掃描方法
⊙否則還是使用全表順序掃描
(4)對於用AND連線的合取選擇條件
●如果有涉及這些屬性的組合索引
⊙優先採用組合索引掃描方法
●如果某些屬性上有一般的索引,可以用索引掃描方法
⊙通過分別查詢滿足每個條件的指標,求指標的交集
⊙通過索引查詢滿足部分條件的元組,然後在掃描這些元組時判斷是否滿足剩餘條件
●其他情況:使用全表順序掃描
(5)對於用OR連線的析取選擇條件,一般使用全表順序掃描
2.連線操作的啟發式規則
(1)如果2個表都已經按照連線屬性排序
⊙選用排序-合併演算法
(2)如果一個表在連線屬性上有索引
⊙選用索引連線演算法
(3)如果上面2個規則都不適用,其中一個表較小
⊙選用Hash join演算法
(4)可以選用巢狀迴圈方法,並選擇其中較小的表,確切地講是佔用的塊數(b)較少的表,作為外表(外迴圈的表) 。
理由:
⊙設連線表R與S分別佔用的塊數為Br與Bs
⊙連線操作使用的記憶體緩衝區塊數為K
⊙分配K-1塊給外表
⊙如果R為外表,則巢狀迴圈法存取的塊數為Br+BrBs/(K-1)
⊙顯然應該選塊數小的表作為外表
9.6 小 結
※查詢處理是關係資料庫管理系統的核心,查詢優化技術是查詢處理的關鍵技術
※本章主要內容
●查詢處理過程
[查詢分析 查詢檢查 查詢優化 查詢執行]
●查詢優化
⊙代數優化 [啟發式代數優化]
⊙物理優化
基於規則的存取路徑優化
基於代價的優化
●查詢執行
自頂向下執行方式
自底向上執行方式
※比較複雜的查詢,尤其是涉及連線和巢狀的查詢
●不要把優化的任務全部放在關係資料庫管理系統上
●應該找出關係資料庫管理系統的優化規律,以寫出適合關係資料庫管理系統自動優化的SQL語句
※對於關係資料庫管理系統不能優化的查詢需要重寫查詢語句,進行手工調整以優化效能