(数据库系统概论|王珊)第九章关系查询处理和关系优化-第二节:查询优化
文章目錄
- 一:查詢優化概述
- (1)查詢優化的地位和重要性
- (2)執行代價
- 二:一個例子
- (1)情況1
- ①:計算廣義笛卡爾積
- ②:作選擇操作
- ③:作投影操作
- (2)情況2
- ①:計算自然連接
- ②:作選擇操作
- ③:作投影操作
- (3)情況3
- 三:代數優化和物理優化
一:查詢優化概述
(1)查詢優化的地位和重要性
關系系統的查詢優化既是關系數據庫管理系統實現的關鍵技術,又是關系系統的優點所在。用戶只要提出“干什么”,而不必指出“怎么干”。
在非關系系統中,用戶必須了解存取路徑,系統提供用戶選擇存取路徑的手段,查詢的效率由用戶的存取策略決定,且系統是無法加以優化的。這就要求用戶需要具有較高的數據庫技術和程序設計水平
查詢優化的優點不僅在于用戶不必考慮如何最好地表達查詢以獲得較高的效率,而且在于系統可以比用戶程序的“優化”做得更好。這是因為:
- 優化器可以從數據字典中獲得很多統計信息,但是用戶程序難以獲得
- 即便數據庫物理統計信息改變,系統也可以進行優化從而選擇相應的執行計劃,但是對于非關系系統則必須要重寫程序
- 優化器可以考慮數百種不同的執行計劃,但程序員一般僅能考慮有限的幾種可能性
- 優化器包含了很多復雜的優化技術,這樣就等同于所用的使用者間接擁有了這些技術
(2)執行代價
目前關系數據庫管理系統通過某種代價模型計算出各種查詢執行策略的執行代價,然后選取代價最小的執行方案。一般來說:總代價=I/O代價+CPU代價+內存代價+通信代價
- 計算查詢代價時一般用查詢處理讀寫的塊數作為衡量單位
二:一個例子
可以通過“求選修了2號課程的學生姓名”這樣一個例子來說明為什么要進行查詢優化
以下是一些系統假設
-
假定學生-課程數據庫中有1 000個學生記錄,10 000個選課記錄(平均每一個學生了選了10門課),其中選修2號課程的選課記錄為50個
-
有7個內存塊(其中分配5塊用于裝入Student表,1塊用于裝入SC表,1塊用于裝入中間結果)
-
其中一塊可以裝入10個student元組(或10個student與SC笛卡爾積元組);一塊也可以 裝入50個SC元組(因為SC的列數較少)
-
連接方法為:基于數據塊的嵌套循環法。
-
之所以這樣分配的原因:因為嵌套循環算法需要選用占用內存少的表作為外表,student表有1000行,每塊裝10行,所以需要100塊;SC表有10000行,每塊裝50行,所以需要200塊。
-
由于student表需要100個內存塊,而分配給它的只有5個,所以不可能一次全部裝入內存,每次只能裝入一部分,比較完了再裝入另外一部分。每換一批數據,內標就需要全部重新裝入以便,所以為了減少內表循環裝入的次數,就必須盡可能的分配內存給外表
-
連接后的元組裝滿一塊后就寫到中間文件上
系統可以用多種等價的關系代數表達式來完成這一查詢,這里只舉三種情況
(1)情況1
Student與Sc作笛卡爾積,而后作行選擇運算(選擇條件為Student.Sno=SC.Sno AND SC.Cno='2'),最后進行投影操作
①:計算廣義笛卡爾積
操作:
- 在內存中盡可能多地裝入某個表(如Student表)的若干塊,留出一塊存放另一個表(如SC表)的元組;
- 然后把SC中的每個元組和Student中每個元組連接,連接后的元組裝滿一塊后就寫到中間文件上,再從SC中讀入一塊和內存中的Student元組連接,直到SC表處理完;
- 這時再一次讀入若干塊Student元組,讀入一塊SC元組,重復上述處理過程,直到把Student表處理完
塊數:
- 讀一遍Student表所需塊數為=100010=100\frac{1000}{10}=100101000?=100塊
- 讀一遍SC表所需要塊數為=1000050=200\frac{10000}{50}=2005010000?=200塊
- 由于Student表可用塊數為5塊,所以分1005=20\frac{100}{5}=205100?=20次讀入
- 同時,Student表的每一部分讀入內存時,SC表都需要重新讀一遍,以此完成與Student表的連接。所以需要讀入200×20=4000塊
- 所以笛卡爾積讀取總塊數為100+4000=4100塊
- Student表和SC表作笛卡爾積共有10710^{7}107行,每塊裝10行,所以中間結果塊數為10610^{6}106塊(寫入)
②:作選擇操作
塊數:
- 所讀塊數為10610^{6}106塊
- 選擇后的結果只有50個(無需讀寫)
③:作投影操作
- 無需讀寫
情況1讀取總塊數:
4100(讀)+10610^{6}106(寫)+10610^{6}106(讀)。約為200萬塊
(2)情況2
Student與Sc作自然連接,而后作行選擇運算(選擇條件為Student.Sno=SC.Sno AND SC.Cno='2'),最后進行投影操作
①:計算自然連接
塊數:
- 首先讀Student和SC,與情況1一致。因此總塊數=4100塊
- Student和SC自然連接后右10000行,所以中間結果塊數1000010\frac{10000}{10}1010000?=1000塊
②:作選擇操作
塊數:
- 讀入中間結果,塊數=1000塊
③:作投影操作
- 50個結果可以不用寫入
情況2讀取總塊數:
4100(讀)+100010001000(寫)+100010001000(讀)。共計6100塊
- 代價約為情況1的1488\frac{1}{488}4881?
(3)情況3
首先Sc作行選擇(選擇條件為SC.Cno='2'),而后作自然連接運算,最后進行投影操作
塊數:
- 先對SC表作選擇操作,只需讀一遍SC表,存取塊數為100塊,因為滿足條件的元組僅50個,不必使用中間文件
- 讀取Student表,把讀入的Student元組和內存中的SC元組作連接。也只需讀一遍Student表,共100塊,把連接結果投影輸出
情況3讀取總塊數:
100(讀)+200(讀)。共計300塊
- 代價約為情況1的的萬分之一
- 代價約為情況2的120\frac{1}{20}201?
三:代數優化和物理優化
通過上面的那個例子可以看到:經過優化,磁盤I/O涉及塊數從200萬下降至300,效率提升顯著,這說明查詢優化是非常有必要的。上述三種情況其有些操作是可以優化的,例如
- 情況一:明知在笛卡爾積后要做行選擇,那為什么不在連接時就把選擇做了,這樣只會留下50個元組,也即省去了100萬個塊的讀寫操作
- 情況二:也是如此,在作自然連接時如果也把選擇做了,就會省去1000個塊的讀寫操作
- 情況三:它是先作選擇再作連接,所以大大減少了塊數
因此,由情況1到情況2再到情況3這樣的優化稱之為代數優化;而如果對底層路徑或算法進行優化則稱之為物理優化。例如對于情況三,可以添加索引,繼續減小代價
總結
以上是生活随笔為你收集整理的(数据库系统概论|王珊)第九章关系查询处理和关系优化-第二节:查询优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVA 10564 计数DP
- 下一篇: Json格式转化为string格式