關系型數據庫管理系統


基礎概念

列(Column):一個屬性,有明確的類型,必須是原子類型(原子類型:不能再進一步分割,沒有內部結構)
行(Row,Tuple,Record):一個記錄
表(Table,Relation):記錄的集合,每條記錄之間無序

Schema:類型,一個表的類型由每個列的類型確定
Instance:具體取值,具體存儲哪些記錄,每個列的具體值
Schema只被定義一次,且一個Schema對應多個Instance

Key:唯一確定一個記錄
Primary Key:唯一確定本表中的一個記錄
Foreign Key:唯一確定另外一張表中的一個記錄(是另外這張表的Primary Key)

主要關系運算:選擇σ(Selection)、投影Π(Projection)、連接⋈(Join)選擇:從一張表中提取一些行,如σMajor=‘計算機’(Student) 等於 select * from Student where Major = '計算機'
投影:從一張表中提取一些列,如ΠName,GPA(Student) 等於 select Name,GPA from Student
連接:已知兩個表R和S,R表的a列和S表的b列,以R.a = S.b為條件的連接,找到兩個表中互相匹配的記錄,即R⋈R.a = S.bS,R.a與S.b被稱為join key,如select * from R,S where R.a=S.b(等同於select * from R inner join S on R.a=S.b)
      對於其他outer join方式而言on是建臨時表用的,where則是在臨時表上再次進行篩選

order by 列名:以指定列為標准進行排序,默認為升序(order by 列名 ASC),也可降序(order by 列名 DESC)
group by 列名:以指定列為基准進行分組統計,同時可以對其他列使用統計函數(如sum, count, avg, max, min)
Having:在group by的基礎上再次進行選擇,如having x>=2


系統架構
前端:SQL Parser
           Query Optimizer
后端:Execution Engine                Transaction management
          Buffer Pool
          Data Storage and Indexing

SQL Parser:SQL語句-》內部表達(如Parsing Tree)
                      語法解析,語法檢查,表名、列名、類型檢查

Query Optimizer: 內部表達-》執行方案(Query plan)
                              產生可行的query plan,並為其預估運行時間、空間代價,在多個可行的query plan中選擇最佳的query plan

Data storage and indexing:在硬盤上存儲數據,並高效的訪問它們
Buffer pool:在內存中緩存硬盤的數據
Execution Engine: query plan-》執行得到結果
                                根據query plan完成相應的運算和操作,數據訪問,關系型運算的實現
Transaction management:事務管理
                                            實現ACID,寫日志,加鎖,保證事務正確性


文件系統與數據庫的比較

文件系統 數據庫
存儲的是文件(file) 存儲的是表(table)
通用的,可以存儲任何數據和程序 專用的,針對關系型數據庫進行存儲
文件無結構,由一系列字節組成 表由記錄組成,每個記錄由多個屬性組成
操作系統內核中實現 用戶態程序中實現
提供基本編程接口(open,close,read,write) 提供SQL接口

共同點:數據都存儲在外存,會根據外存特征在存儲上進行優化(如對硬盤而言,數據被分成定常的數據塊)


 

數據在硬盤上的存儲:
硬盤最小存儲訪問單位為:一個扇區(512B)
文件系統訪問硬盤的單位通常為:4KB
RDBMS最小的存儲單位為database page size,database page size通常為1-n個文件系統的page 如4KB 8KB 16KB ……等

對於一個database page 而言,其結構為:

每個tuple都是一條記錄,slot記錄了每一個tuple相對於頁頭的偏移量,這樣的設計方便存儲變長記錄,slot大小固定

對於一個page中的每一個tuple而言,其結構為:

len為這個tuple的長度,接着首先存儲變長字段的偏移量(var off),再存儲固定長度字段,再存儲變長字段,這樣可以最大化利用空間


 

如果在檢索時,指定了檢索特定條件的數據,那么就會順序訪問每一個page及其中的tuple,效率較低,此時可以使用索引來進行有選擇的訪問
常用索引包括:
        Tree based index:有序,支持點查詢和范圍查詢
        Hash based index:無序,只支持點查詢
Chained hash table:

在硬盤上存儲時,每一個bucket都相當於一個page,若chain上平均bucket太多則加大header size,重新hash

B+ - Trees
 
對於b+樹而言,每個節點都是一個page,所有key存儲在葉子節點,內部節點只作索引用


對於葉子節點而言,key之間都從小到大排列,葉子節點之間右sibling pointer相連接,前一個的sibling 存儲的是下一個葉子節點的page id,每個ptr存儲的是每一條記錄的id(record id)


對於內部節點而言,有subtree0<key1<subtree1<key2<……<keyn

主索引與二級索引:
主索引:索引中存儲了記錄,且索引順序與記錄的存儲順序相同
二級索引:索引的順序與記錄的存儲順序不同,索引的值存儲的不是記錄,而是記錄的位置(包括page id 和頁內的tuple slot id)
順序訪問與二級索引訪問對比:對於順序訪問而言,需要順序讀取每一個page並處理其中的每一個tuple對比是否符合檢索條件,如果用二級索引則會隨機讀相關的page並有選擇的處理相關的tuple
如何選擇使用順序訪問查找還是二級索引查找呢?這取決於index selectivity、硬盤順序讀/隨機讀性能,通過預估兩種方式的執行時間來選擇其中所需時間較短的方案,這個任務由query optimizer完成


 

Buffer Pool
數據訪問具有局部性:
時間局部性:同一數據可能在一段時間內被多次訪問(使用Buffer Pool將其暫時存儲在內存中)
空間局部性:位置相近的數據可能會被一起訪問(以Page為單位進行讀寫)
為了適應這兩個特性,Buffer Pool被設計為由和Page相同大小的frame組成,每個frame可以存儲一個page
常見替換策略:random、FIFO、LRU
LRU(最近最少使用):


實現放法2:將buffer head做成一鏈表,每次訪問過的page都將其移動到表頭,則當需要替換時,只需要替換最后一個page,此時代價為O(1),但移動及多線程需要更多代價

Clock算法:


當一個頁裝入內存時,其R賦值為1,移動指針
若訪問到的頁值為1則將其置為0,移動指針
如果遇到R=0的則意味着這個page一直沒被訪問,則替換掉它


運算的實現
query plan將最終表現為一顆operate tree

每個節點代表一個運算,運算的輸入來自於該節點的孩子節點,運算產生結果后送往其父節點
pull:每個operator都實現了open、close、getnext等方法,父節點調用子節點的GetNext取得子節點的輸出
push:子節點將輸出放入緩沖區,通知父節點去讀取

join的實現:nested loop、hashing、sorting
1、nested loop join

若R有MR個Page,S有MS個Page,每個Page有B個記錄
如果都掃描一遍,則總共需要讀取:MR+MRMSB次,很費IO

Block nested loop join

每次讀取M行記錄 到緩存中,然后讀取一次S,這樣減少了讀取R中記錄的次數
此時總的讀取page次數為:MR+(MR/M)MS次,減少了一定的IO次數

Index nested loop join

查兩個表中的index來尋找匹配

Hash join:
Simple hash join

首先讀取R,為其建立hash table,再讀S,將與指定的join key相同join key的條目進行hash,然后去之前為R構造的hash table進行探測找到匹配
GRACE Hash Join
若內存不夠大,無法放下其hash table,則可以將其hash結果分塊(mod 一個partition number),同樣的,對S每個匹配的條目hash后也mod partition nuber,這樣就能去R的hash table的對應塊中進行探測,來尋找匹配

若R有MR個Page,S有MS個Page,每個Page有B個記錄
則對R和S進行hash時,讀MR+MS個Page,構建hash table時寫MR+MS個Page,進行匹配時又讀了一遍MR+MS,所以總代價為讀2(MR+MS)個Page,寫MR+MS個Page

Sort Merge Join
首先將R和S按照其join key(如R.a,S.b)排序,然后對其結果進行混合,之后對其進行排序,那么相同的joinkey則會被排在一起
通常代價比Hash join稍高,當表已經按照join key有序時會使用此方法

 


事務處理

ACID:
Atomicity(原子性):要么完全執行,要么完全沒有執行
Consistency(一致性):從一個正確狀態轉換到另一個正確狀態
Isolation(隔離性):每個事務與其他並發事務互不影響
Durability(持久性):transaction commit 后,結果持久有效,crash也不消失

如何判斷一組transaction正確執行:存在一個順序,按照這個順序依次串行執行這些transactions,得到的結果與並行執行相同(可串行化,即並行執行結果=某個順序的串行執行結果)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM