『数据库』数据库的查询可不是只知道Select就可以的--关系数据库系统的查询处理
數據庫從入門到精通:戳我
關系數據庫系統的查詢處理
一、關系數據庫系統的查詢處理
1.查詢處理步驟
關系數據庫管理系統查詢處理階段 :
1)查詢分析 :對查詢語句進行掃描、詞法分 析和語法分析
- 詞法分析:從查詢語句中識別出正確的語言符號
- 語法分析:進行語法檢查
2)查詢檢查
- 查詢檢查的任務
合法權檢查
視圖轉換
安全性檢查
完整性初步檢查 - 根據數據字典中有關的模式定義檢查語句中的數據庫對象,如關系名、屬性名是否存在和有效
- 如果是對視圖的操作,則要用視圖消解方法把對視圖的操作轉換成對基本表的操作
- 根據數據字典中的用戶權限和完整性約束定義對 用戶的存取權限進行檢查
- 檢查通過后把SQL查詢語句轉換成內部表示,即等價的關系代數表達式。
- 關系數據庫管理系統一般都用查詢樹,也稱為語法分析樹來表示擴展的關系代數表達式。
3)查詢優化:選擇一個高效執行的查詢處理策略
查詢優化分類:
- 代數優化/邏輯優化:指關系代數表達式的優化
- 物理優化:指存取路徑和底層操作算法的選擇
查詢優化的選擇依據:
- 基于規則(rule based)
- 基于代價(cost based)
- 基于語義(semantic based)
4)查詢執行:
- 依據優化器得到的執行策略生成查詢執行計劃
- 代碼生成器(code generator)生成執行查詢計劃 的代碼
- 兩種執行方法:自頂向下;自底向上。
2.實現查詢操作的算法示例
1)選擇操作的實現
全表掃描方法 (Table Scan)
- 對查詢的基本表順序掃描,逐一檢查每個元組是否滿足 選擇條件,把滿足條件的元組作為結果輸出。
- 適合小表,不適合大表。
索引掃描方法 (Index Scan)
- 適合于選擇條件中的屬性上有索引(例如B+樹索引或Hash索引)。
- 通過索引先找到滿足條件的元組主碼或元組指針,再通過元組指針直接在查詢的基本表中找到元組。
2)連接操作的實現
連接操作是查詢處理中最耗時的操作之一。
嵌套循環算法(nested loop join)
- 對外層循環(Student表)的每一個元組(s),檢索內層循 環(SC表)中的每一個元組(sc)
- 檢查這兩個元組在連接屬性(Sno)上是否相等
- 如果滿足連接條件,則串接后作為結果輸出,直到外 層循環表中的元組處理完為止。
排序-合并算法(sort-merge join 或merge join)
- 如果連接的表沒有排好序,先對Student表和SC表按 連接屬性Sno排序
- 取Student表中第一個Sno,依次掃描SC表中具有相 同Sno的元組
- 當掃描到Sno不相同的第一個SC元組時,返回 Student表掃描它的下一個元組,再掃描SC表中具有 相同Sno的元組,把它們連接起來
- 重復上述步驟直到Student 表掃描完
注意:
- Student表和SC表都只要掃描一遍
- 如果兩個表原來無序,執行時間要加上對兩個表的排序時間
- 對于大表,先排序后使用排序-合并連接算法執行連接,總的時間一般仍會減少
索引連接(index join)算法
- 在SC表上已經建立屬性Sno的索引。
- 對Student中每一個元組,由Sno值通過SC的索引查 找相應的SC元組。
- 把這些SC元組和Student元組連接起來 循環執行前兩步,直到Student表中的元組處理完為止
Hash Join算法
前提:假設兩個表中較小的表 在第一階段后可以完全放入內存的hash桶中。
- 把連接屬性作為hash碼,用同一個hash函數把Student表和SC表 中的元組散列到hash表中。
- 劃分階段(building phase, 也稱為partitioning phase)
對包含較少元組的表(如Student表)進行一遍處理
把它的元組按hash函數分散到hash表的桶中 - 試探階段(probing phase,也稱為連接階段join phase)
對另一個表(SC表)進行一遍處理
把SC表的元組也按同一個hash函數(hash碼是連接屬性)進 行散列
把SC元組與桶中來自Student表并與之相匹配的元組連接起來
關系數據庫系統的查詢優化
- 查詢優化在關系數據庫系統中有著非常重要的地位
- 關系查詢優化是影響關系數據庫管理系統性能的關鍵因素
- 由于關系表達式的語義級別很高,使關系系統可以從關系表達式中分析查詢語義,提供了執行查詢優化的可能性
一、概述
- 1.關系系統的查詢優化
是關系數據庫管理系統實現的關鍵技術又是關系系統的優點所在。
減輕了用戶選擇存取路徑的負擔。 - 2.非關系系統
用戶使用過程化的語言表達查詢要求,執行何種記錄級的操作,以及操作的序列是由用戶來決定的。
用戶必須了解存取路徑,系統要提供用戶選擇存取路徑的手段,查詢效率由用戶的存取策略決定。
如果用戶做了不當的選擇,系統是無法對此加以改進的。
3.查詢優化的優點
- 用戶不必考慮如何最好地表達查詢以獲得較好的效率
- 系統可以比用戶程序的“優化”做得更好
(1)優化器可以從數據字典中獲取許多統計信息,而用戶程序則難以獲得這些信息。
(2)如果數據庫的物理統計信息改變了,系統可以自動對查詢重新優化以選擇相適應的執行計劃。在非關系系統中必須重寫程序,而重寫程序在實際應用中往往是不太可能的。
(3)優化器可以考慮數百種不同的執行計劃,程序員一 般只能考慮有限的幾種可能性。
(4)優化器中包括了很多復雜的優化技術,這些優化技術往往只有最好的程序員才能掌握。系統的自動優化相當于使得所有人都擁有這些優化技術
4.關系數據庫管理系統通過某種代價模型計算出各種查詢執行策略的執行代價,然后選取代價最小的執行方案
- 集中式數據庫
執行開銷主要包括:磁盤存取塊數(I/O代價);處理機時間(CPU代價);查詢的內存開銷
I/O代價是最主要的 - 分布式數據庫
總代價=I/O代價+CPU代價+內存代價+通信代價
5.查詢優化的總目標
- 選擇有效的策略
- 求得給定關系表達式的值
- 使得查詢代價最小(實際上是較小)
代數優化
一、關系代數表達式等價變換規則
- 代數優化策略:通過對關系代數表達式的等價變換來提高查詢效率。
- 關系代數表達式的等價:指用相同的關系代替兩個表達式中相應的關系所得到的結果是相同的。
- 兩個關系表達式E1和E2是等價的,可記為E1≡E。
常用的等價變換規則:
1.連接、笛卡爾積交換律
設E1和E2是關系代數表達式,F是連接運算的條件,則有
2.連接、笛卡爾積的結合律
設E1,E2,E3是關系代數表達式,F1和F2是連接運算的條件
3.投影的串接定律
- E是關系代數表達式
- Ai(i=1,2,…,n),Bj(j=1,2,…,m)是屬性名
- {A1,A2,…,An}構成{B1,B2,…,Bm}的子集
4.選擇的串接定律
- E是關系代數表達式,F1、F2是選擇條件
- 選擇的串接律說明選擇條件可以合并,這樣一次就可檢查全部條件
5.選擇與投影操作的交換律
- 選擇條件F只涉及屬性A1,…,An。
- 若F中有不屬于A1,…,An的屬性B1,…,Bm有更一般規則:
6. 選擇與笛卡爾積的交換律 - 如果F中涉及的屬性都是E1中的屬性,則
- 如果F=F1∧F2,并且F1只涉及E1中的屬性,F2只涉及E2中的屬性,則由上面的等價變換規則1,4,6可推出:
- 若F1只涉及E1中的屬性,F2涉及E1和E2兩者的屬性,則仍有
它使部分選擇在笛卡爾積前先做。
7. 選擇與并的分配律
設E=E1∪E2,E1,E2有相同的屬性名,則
8. 選擇與差運算的分配律
若E1與E2有相同的屬性名,則
9. 選擇對自然連接的分配律
F只涉及E1與E2的公共屬性
10. 投影與笛卡爾積的分配律
設E1和E2是兩個關系表達式,A1,…,An是E1的屬性,B1,…,Bm是E2的屬性,則
11. 投影與并的分配律
設E1和E2有相同的屬性名,則
二、查詢樹的啟發式優化
典型的啟發式規則
(1)選擇運算應盡可能先做
在優化策略中這是最重要、最基本的一條。
(2)把投影運算和選擇運算同時進行
如有若干投影和選擇運算,并且它們都對同一個關系操作,則可以在掃描此關系的同時完成所有的這些運算以避免重復掃描關系。
(3) 把投影同其前或其后的雙目運算結合起來,沒有必要為了去掉某些字段而掃描一遍關系。
(4) 把某些選擇同在它前面要執行的笛卡爾積結合起來成為一個連接運算,連接特別是等值連接運算要比同樣關系上的笛卡爾積省很多時間。
(5) 找出公共子表達式
- 如果這種重復出現的子表達式的結果不是很大的關系
- 并且從外存中讀入這個關系比計算該子表達式的時間少得多
- 則先計算一次公共子表達式并把結果寫入中間文件是合算的。
- 當查詢的是視圖時,定義視圖的表達式就是公共子表達式的情況
物理優化
- 代數優化改變查詢語句中操作的次序和組合,不涉及底層的存取路徑
- 對于一個查詢語句有許多存取方案,它們的執行效率不同, 僅僅進行代數優化是不夠的
- 物理優化就是要選擇高效合理的操作算法或存取路徑,求得優化的查詢計劃
物理優化方法
- 基于規則的啟發式優化
啟發式規則是指那些在大多數情況下都適用,但不是在每種情況下都是適用的規則。 - 基于代價估算的優化
優化器估算不同執行策略的代價,并選出具有最小代價的執行計劃。 - 兩者結合的優化方法
常常先使用啟發式規則,選取若干較優的候選方案,減少代價估算的工作量
然后分別計算這些候選方案的執行代價,較快地選出最終的優化方案
一、基于啟發式規則的存取路徑選擇優化
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)
- 顯然應該選塊數小的表作為外表
二、基于代價的優化
- 啟發式規則優化是定性的選擇,適合解釋執行的系統
解釋執行的系統,優化開銷包含在查詢總開銷之中 - 編譯執行的系統中查詢優化和查詢執行是分開的
可以采用精細復雜一些的基于代價的優化方法
1.統計信息
基于代價的優化方法要計算查詢的各種不同執行方案的執行代價,它與數據庫的狀態密切相關
優化器需要的統計信息
(1)對每個基本表
- 該表的元組總數(N)
- 元組長度(l)
- 占用的塊數(B)
- 占用的溢出塊數(BO)
(2)對基表的每個列
- 該列不同值的個數(m)
- 列最大值
- 最小值
- 列上是否已經建立了索引
- 哪種索引(B+樹索引、Hash索引、聚集索引)
- 可以計算選擇率(f)
如果不同值的分布是均勻的,f=1/m。
如果不同值的分布不均勻,則要計算每個值的選擇率,f=具有該值的元組數/N。
(3)對索引
- 索引的層數(L)
- 不同索引值的個數
- 索引的選擇基數S(有S個元組具有某個索引值)
- 索引的葉結點數(Y)
2.代價估算示例
(1)全表掃描算法的代價估算公式
- 如果基本表大小為B塊,全表掃描算法的代價 cost=B
- 如果選擇條件是“碼=值”,那么平均搜索代價 cost=B/2
(2)索引掃描算法的代價估算公式
如果選擇條件是“碼=值”
- 則采用該表的主索引;
- 若為B+樹,層數為L,需要存取B+樹中從根結點到葉結點L塊,再加上基本表中該元組所在的那一塊,所以cost=L+1
如果選擇條件涉及非碼屬性
- 若為B+樹索引,選擇條件是相等比較,S是索引的選擇基數(有S個元組滿足條件)
- 滿足條件的元組可能會保存在不同的塊上,所以(最壞的情況)cost=L+S
如果比較條件是>,>=,<,<=操作
- 假設有一半的元組滿足條件
- 就要存取一半的葉結點
- 通過索引訪問一半的表存儲塊
- cost=L+Y/2+B/2
- 如果可以獲得更準確的選擇基數,可以進一步修正Y/2與B/2
(3)嵌套循環連接算法的代價估算公式
嵌套循環連接算法的代價
cost=Br+BrBs/(K-1)
如果需要把連接結果寫回磁盤
cost=Br+Br Bs/(K-1)+(Frs*Nr*Ns)/Mrs
- 其中Frs為連接選擇性(join selectivity),表示連接結果元組數的比例
- Mrs是存放連接結果的塊因子,表示每塊中可以存放的結果元組數目
(4)排序-合并連接算法的代價估算公式
- 如果連接表已經按照連接屬性排好序,則
cost=Br+Bs+(Frs*Nr*Ns)/Mrs - 如果必須對文件排序
還需要在代價函數中加上排序的代價
對于包含B個塊的文件排序的代價大約是
(2*B)+(2*B*log2B)
==查詢處理是關系數據庫管理系統的核心,查詢優化技術是查詢處理的關鍵技術 ==
總結
以上是生活随笔為你收集整理的『数据库』数据库的查询可不是只知道Select就可以的--关系数据库系统的查询处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 还有五场!饿了么免单活动又来了 一文看懂
- 下一篇: 『数据库』怎样设计一个数据库