資料庫查詢演算法剖析

2021-06-14 07:36:28 字數 2279 閱讀 9048

一、常用查詢連線演算法演示

簡單介紹選擇操作和連線操作的實際演算法,確切地說是演算法思想。每一種操作有多種執行這個操作的演算法。

選擇操作的實現

如下實現演算法:

例:select * from student where 《條件表示式》;

考慮《條件表示式》的幾種情況:

c1:無條件;

c2:sno='200215121';

c3:sage>20;

c4:sdept='cs'and sage>20;

1.簡單的全表掃瞄方法

對查詢的基本表順序掃瞄,注意檢查每個元組是否滿足選擇條件,把滿足條件的元組作為結果輸出。對於小表,這種方法簡單有效。對於大表順序掃瞄十分費時,效率很低。

2.索引(或雜湊)掃瞄方法

如果選擇條件中的屬性上有索引(例如b+樹索引或hash索引,可以用索引掃瞄方法。通過索引先找到滿足條件的元組主碼或元組指標,再通過元組指標直接在查詢的基本表中找到元組。

例-c2:以c2為例,sno='200215121',並且sno上有索引(或sno是雜湊碼),則可以使用索引(或雜湊)得到sno為'200215121'元組的指標,然後通過元組指標在student表中檢索到該學生。

例-c3:以c3為例,sage>20,並且sage上有b+樹索引,則可以使用b+樹索引找到sage=20的索引項,以此為入口點在b+樹的順序集上得到sage>20的所有元組指標,然後通過這些元組指標到student表中檢索到所有年齡大於20的學生。

例-c4:以c4為例,sdept='cs' and sage>20,如果sdept和sage上都有索引,一種演算法是;分別用上面兩種方法分別找到sdept='cs'的一組元組指標和sage>20的另一組元組指標,求這2組指標的交集,再到student表中檢索,就得到計算機系年齡大於20的學生。

另一種演算法是找到sdept='cs'的一組元組指標,通過這些元組指標到student表中檢索,並對得到的元組檢索另一些選擇條件(如sage>20)是否滿足,把滿足條件的元組作為結果輸出。

二:連線操作的實現

連線操作室查詢處理中最耗時的操作之一。不失一般性,這裡只討論等值連線(或自然連線)最常用的實現演算法.

[例]select * from student,sc where student.sno=sc.sno;

1.巢狀迴圈方法(nested loop)

這是最簡單可行的演算法。對外層迴圈(student)的每乙個元組(s),檢索內層迴圈(sc)中的每乙個元組(sc),並檢查這兩個元組在連線屬性(sno)上是否相等。如果滿足連線條件,則串接後作為結果輸出,直到外層迴圈表中的元組處理完為止。

2.排序-合併方法(sort-merge join或merge join)

這也是常用的演算法,尤其適合連線的諸表已經排好序的情況。

用排序-合併連線方法的步驟是:

(1)如果連線的表沒有排好序,首先對student表和sc表按連線屬性sno排序;

(2)取student表中第乙個sno,依次掃瞄sc表中具有相同sno的元組;把他們連線起來(如圖9,2所示);

(3)當掃瞄到sno不相同的第乙個sc元組時,返回student表掃瞄它的下乙個元組,再掃瞄sc表中具有相同的sno的元組,把它們連線起來。

重複上述步驟直到student表掃瞄完。

這樣studetn表和sc表只要掃瞄一遍。當然,如果2個表原來無序,執行時間要加上對兩個表的排序時間。即使這樣,對於2個大表,先排序後使用sort-merge join方法執行連線,總的時間一般仍會大大減少。

3、索引連線(index join)方法

用索引連線方法的步驟是:

(1)在sc表上建立屬性sno的縮影,如果原來沒有的話;

(2)對student中每一元組,由sno值通過sc的索引查詢相應的sc元組;

(3)把這些sc元組和student元組連線起來。

迴圈執行(2)(3),直到student表中的元組處理完為止。

4、hash join方法

把連線屬性作為hash碼,用同乙個hash函式把r和s中的元組雜湊到同乙個hash檔案中。第一步,劃分階段(partitioning phase),對包含較少元組的表(比如r)進行一遍處理,把它的元組按hash函式分散到hash表的桶中;第二步,試探階段(probing phase),也稱為連線階段(join phase),對另乙個表(s)進行一遍處理,把s的元組雜湊到適當的hash桶中,並把元組與桶中所有來自r並與之相匹配的元組連線起來。

上面hash join演算法假設兩個表中較小的表的第一階段後可以完全放入記憶體的hash桶中。不需要這個前提條件的hash join演算法以及許多改進的演算法就不說了。以上的演算法思想可以推廣到更加一般的多個表的連線演算法上。

資料庫查詢演算法剖析

一 常用查詢連線演算法演示 簡單介紹選擇操作和連線操作的實際演算法,確切地說是演算法思想。每一種操作有多種執行這個操作的演算法。選擇操作的實現 如下實現演算法 例 select from student where 條件表示式 考慮 條件表示式 的幾種情況 c1 無條件 c2 sno 2002151...

SQL Server 資料庫優化剖析

事件類 stored procedures rpc completed tsql sql batchcompleted 以特殊字元作為篩選條件 4 t sql查詢trace表 a 設定抓取的時候段 b 保持成檔案 然後用下面語句查詢檔案 唯一性高的字段放最前面 select where orderb...

資料庫查詢

0 echo else 釋放記錄集所占用的記憶體 mysql free result result 關閉該資料庫連線 mysql close connection 1.建立到資料庫伺服器的乙個連線。這個資訊包括伺服器位址 mysql使用者名稱 密碼 選擇的資料庫名,這些變數儲存在php的變數中。2....