資料庫原理系列 查詢操作實現

2021-10-10 21:48:36 字數 1607 閱讀 4434

概述

複雜動作 = 基本動作的各種方式的組合

資料庫的三大類操作

實現演算法考慮因素

是否需要一次將被操作集合全部裝入記憶體

需要:整個關係的一元操作: δ

\delta

δ(r), γ

\gamma

γ(r) , τ

\tau

τ(r)

迭代器

定義示例

實現演算法總覽

實現演算法總覽

不同記憶體情況的實現演算法

全主存實現演算法

半主存實現演算法

大關係實現演算法

兩趟掃瞄演算法

物理演算法需要考慮 b

rb_r

br​xs = t

rt_r

tr​t

st_s

ts​ (i

ri_r

ir​+i

si_s

is​)/b。

連線操作—基本實現演算法

全主存實現演算法

半主存實現演算法

大關係實現演算法

實現(記憶體操作均未優化)

//*****==io 操作*****====

for i = 1 to b s /(m-2) // 注:一次讀入m-2塊

read i-th sub-set of s into m s ;

for j = 1 to b r // 注:一次讀入一塊

read j-th block of r into m r ;

//*****==io 操作結束*****====

//*****===記憶體操作**********=

for p = 1 to (m-2)b/i s

read p-th record of s;

for q = 1 to b/i r

read q-th record of r;

if r.a   s.b then

next q

next p

//*****==記憶體操作結束**********

next j

next i

演算法複雜性:i/o次數估計為br(bs/(m-2)) + bs(暫忽略結果關係儲存的i/o次數)

基於索引的演算法

基於索引的選擇演算法

聚簇和非聚簇索引,使用時其效率是不一樣的。

假設b(r)=1000, t(r)=20000, 即:r有20000個元組存放到1000個塊中。a是r的乙個屬性,在a上有乙個索引,並且考慮σa=

0\sigma_

σa=0

​(r)操作:

使用索引(v(r, a)表示a屬性在r**現的不同值的個數)

基於有序索引的連線演算法:zig-zag連線演算法

r 和s 都有在y屬性上的b+tree索引;r 和s均從左至右讀取索引樹的葉子結點

(3) 如果a=b,則將r和s關係中對應的元組讀出並進行連線,直到r的所有相等的a值 和s的所有相等的b值對應的元組都處理完畢;將r的下乙個索引項賦予a,繼續執行(2)。

主存演算法

一元關係操作

二元關係操作

連線操作大關係演算法改進

資料庫查詢操作

假設現在資料庫內有activity表 act activity.objects.get id id,status status 用get方法查詢,查詢不到內容或查詢結果多餘1條的時候會丟擲異常 act activity.objects.filter id id 用filter方法查詢,查詢不到內容,...

資料庫 操作查詢

1 基本連線 基本連線遵循的基本原則 select子句列表中,每個目標列前都要加上基表名稱。from子句應包括所有使用的基表。where子句應定義乙個同等連線。2 內連線 使用比較運算子對錶之間的某些資料進行比較,並列出這些表中與連線條件相匹配的資料行。select 列名 from table1 i...

資料庫部分原理實現

有個做資料庫的同學,平時會和他聊一下,知道原理了才會更好用資料庫 關於連線的實現方法 l巢狀迴圈法 nested loop 1 首先在表 1中找到第乙個元組,然後從頭開始掃瞄表 2,逐一查詢滿足連線條件的元組,找到後就將表 1中的第乙個元組與該元組拼接起來,形成結果表中乙個元組。2 表2全部查詢完後...