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