家族关系查询系统程序设计算法思路_【学习笔记】数据库基础 - 查询优化
目錄
- 什么是數據庫查詢優化?
- 影響查詢優化的因素
- 優化策略概述
- 查詢優化的總體思路
- 語義優化 -- 內容等價性
- 語法優化(邏輯層優化)---語法等價性
- 執行優化(物理層優化)
- 查詢優化在DBMS中的位置
- 邏輯查詢優化
- 關系代數
- 優化示例
- 關系代數操作次序交換的等價性
- 明確定義關系代數的等價性
- 等價定理
- 基于關系代數的查詢優化算法及示例
- ==關系代數優化算法:==
- 算法應用示例
- 物理查詢優化
- 為什么使用物理查詢優化?
- 物理查詢運算符
- 獲取關系元組的操作
- 關系操作的各種實現算法
- DBMS如何衡量物理查詢計劃的優劣?
- 代價估算
- 對投影運算進行代價估算
- 對選擇運算的代價估算
- 連接運算的代價估算
什么是數據庫查詢優化?
計算機科學家們,一直在追求著一些較為通用的目的,比如:
1.通過計算機去解決更多的問題
2.通過計算機去更快的解決問題
而數據庫查詢優化的目的,更多服務于后面的這個目的,更快的進行查詢,快速響應查詢結果。
影響查詢優化的因素
而在數據庫查詢中,哪些因素影響著查詢的效率呢?
1.計算的數據量。數據量越大,一般計算的次數越多,計算的時間也越長。
2.IO。這也和第一條有關,往往數據量越大,需要的存儲空間越大(這里認為數據庫中的數據是存在硬盤中的),所以IO的開銷越大。
為了進一步深入理解這個問題,我們引入一個簡單的例子:
- 該例子從關系代數角度進行講解。
- Student * SC * CourseStudent?SC?Course最先進行計算,然后后續的計算都建立在此計算結果之上。即,隨后的選擇操作將會建立在巨大的數據量之上,這計算是非常耗時的。
【一個經驗】大數據量如果經過計算步驟越多,那么越耗時。所以,如果能夠在等價情況下,在計算早期將數據量降下來,那么將大大提升查詢速度。
下面給出了,針對上面的情況的一些等價的關系代數式,這些關系代數將數據量在早期將量降了下來,從而使得:
- 在笛卡爾積之前將數據量降了下來,從而使得笛卡爾積后,數據量不會太大。
- 之前的巨大數據量,不會出現在任何一個步驟,大大節省了計算時間。
優化策略概述
查詢優化的總體思路
語義優化 – 內容等價性
本文章中暫且不深入探討此方面的內容。
語法優化(邏輯層優化)—語法等價性
執行優化(物理層優化)
查詢優化在DBMS中的位置
- 藍色虛線部分對應著查詢優化。
邏輯查詢優化
基本思想:
【次序的重要性】關系代數的形式,影響著計算的次序,而次序又會影響著每一步的計算量,以及總體計算量。
【2個明星操作】改變關系代數的操作次序:盡可能早做選擇 和投影運算。
【為何提早進行這2個操作:選擇 & 投影】
【基本原因】 這些操作能夠在早期將數據量降下來,從而避免較多的數據量流入后續步驟中,從而使得大數據量能夠在早期計算中降下來。舉個簡單的例子:100萬條的數據量,情況1:經過5個步驟才降下來,最終得到結果;情況2:100萬的數據量在第一步降到了1萬,隨后經過4個步驟。情況2明顯總的計算量要比情況1少。
【投影如何降數據量?】一個表有100個維度,有100萬條記錄,而你只需要2個維度。投影操作將數據量 變為 : 2維 * 100萬。
【選擇如何降低數據量?】一個表有100個維度,有100萬條記錄,而你只需要其中的1萬條記錄。選擇操作將數據量變為: 100維 * 1萬。
其它關系操作:
對數據量的降低沒有如此立桿見影。
總體思路:
- 【次序很重要】同樣的語義表達,在關系代數中往往有 多種形式,這些形式最終獲得的結果是相同的。但其反映的內部計算過程卻是不同的,而計算過程又是和計算機的計算量緊密結合的,因而計算的次序安排是邏輯優化的本質。
- 【等價定理對于次序很重要】定理給了關系代數形式轉化的機會,使得關系代數的次序可以調節。
關系代數
【更新中。。。】為何需要關系代數?(簡單論述代數的作用)
(論述關系理論的作用)
優化示例
在講解示例的同時,說明相應的邏輯優化策略。
考慮一個圖書管數據庫:
【查詢需求1】:
- 【步驟】sql語句最先被識別轉化成關系代數,隨后將代數轉化為樹結構(語法樹)。
很多優化步驟都是在遍歷語法樹的過程中進行的,簡單來說就是:樹的遍歷 + 結點操作規則(如關系代數等價定理)。(理論知識可參考編譯原理部分)
- 【優化的體現】(1)在關系代數層面,是操作次序的變化;(2)從語法樹角度,優化就是結點的等價移動。
邏輯層的優化策略:
優化后的效果:
- 【總體】這里的優化,是將選擇、投影操作盡量向樹下移動。為了使其能夠向下移動,有時候會增加一些投影等步驟。
- 【選擇涉及到一個表】直接向下移動到最靠近相應表的地方。如,借出時間作為條件時,可以向下直接移動到LOAN結點的上一層。
- 【選擇涉及多個表】將可拆解的獨立的條件,進行拆解,然后各自按照上一個準則進行下移。
- 【投影】投影一般是可以直接下移到表附近的,但是有時候投影涉及到的維度比較少,而中間某個過程可能使用投影之外的維度。因此,在投影下移的時候,必須把中間過程中用到的維度積累起來,最終移動到表的上一層。
關系代數操作次序交換的等價性
前面提到了關系代數的操作次序,能夠影響計算量,查詢的速度。為此,我們需要將關系代數進行等價變換,從而使得計算機執行關系代數時的耗時最小。
而變換是需要等價規則/定理作為支撐,本部分內容主要介紹等價變換定理。
【備注】構建一個系統之后,準則之后,我們根據現實中的實際的情況,在規則中引入相應的定理,以此能夠使得一個代數轉化成我們期待的代數。
思考:
明確定義關系代數的等價性
從結果集合的角度,定義等價性。
根據這個定義,你能夠通過定義去證明后面的等價定理。
等價定理
定理L1:
定理L2:
- 通過不同的結合次序,能夠使得中間結果(中間產生的數據量)降低,從而使得整個過程中總體的數據量降低。
- 【簡單的例子】 積運算為例,現在有3個表,其中t1有20條記錄,t2有30條記錄,t3有100條記錄。3個表求笛卡爾積。
情況1:
【(t1 times t2) times t3(t1×t2)×t3】計算分為兩個步驟:(1)t1 times t2t1×t2 產生了600的數據量;(2)與t3求積,產生了60000的數據量。
情況2:
【t1 times (t2 times t3)t1×(t2×t3)】計算分為兩個步驟:(1) t2 times t3t2×t3 產生了3000的數據量;(2) 與t1求積,產生了60000的數據量。
【結論】雖然情況1與情況2中的第2步計算產生了相同的數據量,然而在第1步中卻產生了不同的數據量。(數據量上升的越早,中間產生的代價越多)
定理L3:
- 【從左到右看公式】能夠減少一次投影操作。如果每次投影需要遍歷1次表的話,那么左邊的公式需要掃描2次表,而右邊的公式需要掃描1次表。
- 【從右向左看公式】將投影擴展,分解為兩次,從而使得投影維度多的那次可以向語法樹的下層移動。(因為右邊的投影可能因為,在下移后,出現某些維度被過濾掉,而這些維度,正好要在中間某個步驟用)
定理L4:
- 解釋類似于定理L3.
定理L5:
定理L6:
定理L7:
定理L8 & 定理L9:
定理L10:
其它思考:
基于關系代數的查詢優化算法及示例
關系代數優化算法:
- 【兩大步驟】算法可以分為兩大步驟:(1)遍歷樹,結點變換;(2)分組。
算法應用示例
== 待優化的結構==
【優化步驟1】選擇操作下移:
【移動步驟2】投影移動:
【為執行做準備】分組:
思考:(復雜sql的優化)
物理查詢優化
前面從概念上(關系代數角度)進行了優化,但關系代數需要通過計算機層面的具體的算法進行實現。更細節一點來說,關系代數的每一步,都對應著相應的物理計算,而這些物理計算往往存在多種算法,比如說某表具有索引輔助結構,并且關系代數中某部分中含有走索引的條件,那么執行時,一般會采取索引掃描算法。沒有索引,則可能走一趟掃描算法等算法。
為什么使用物理查詢優化?
- 【基本目標】物理查詢優化的主要目標在于,使得IO盡量降低,使得計算盡量減少。
- 【具體表現】表空間掃描范圍盡量少,盡量合并能夠一起的計算(如,一趟掃描中做多件事情)。
物理查詢運算符
獲取關系元組的操作
關系操作的各種實現算法
DBMS如何衡量物理查詢計劃的優劣?
依據什么信息來計算這些方案的上述各種指標呢?
- 【數據字典】數據字典中包含數據庫的模式信息以及部分統計信息(比如,如下圖的統計信息)。
如何收集統計信息?
代價估算
代價估算,決定了選擇關系代數某部分采用哪種計算方法。
結合前面的衡量指標理解本部分。
對投影運算進行代價估算
對選擇運算的代價估算
復雜選擇運算:
- 利用關系代數定理,將關系代數進行拆解。
- 逐步從里向外進行估算。(相當于前面兩個估算示例相結合)
復雜的或運算估計:
- 【概率工具】此處的估算,引入了概率工具。首先計算出同時不滿足C1和C2的概率,然后讓1減去前面的結果,得到滿足C1或C2的 概率。最后估算涉及到的數量。
連接運算的代價估算
- 再次利用概率工具。
- 先求得笛卡爾積,然后連接運算的結果一定是笛卡兒積的子集合。
- 下面的關鍵問題在于如何估算這個子集合。這里再次運用了概率工具以及大量的假設,通過引入這些合理的假設,使得連接運算的估算成為可能。這里就兩個表具有某個相同Y值得概率進行了假設,認為其和V(R,Y)或V(S,Y)有直接的關系。這里不再是僅僅是假設在一個表中出現不同值得概率是相等的,而是假設了更多的內容,即兩個表中出現某個相同值得概率是相等的。
文章來自我的CSDN博客:
【學習筆記】數據庫基礎 - 查詢優化?blog.csdn.net參考:
數據庫系統(下):管理與技術
總結
以上是生活随笔為你收集整理的家族关系查询系统程序设计算法思路_【学习笔记】数据库基础 - 查询优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cefsharp 网页打印不好用_201
- 下一篇: java信息管理系统总结_java实现科