oralce資料庫中資料的查詢

2021-08-17 10:21:03 字數 4086 閱讀 9528

資料讀取

首先資料塊讀入到buffer cache中,並將其放在lru(last recently used)鍊錶的mru(most recently used)端,當需要再次訪問該塊時可以直接從buffer cache中讀取,

如果有新的資料需要被讀入buffer cache中,而buffer cache又沒有足夠的空閒空間,oracle就根據lru演算法將lru鍊錶中lru端的資料置換出去。當這些資料被再次訪問到時,需要重新從磁碟讀入。

當發生全表掃瞄(fulltable scan)時,使用者程序讀取表的資料塊,並將他們放在lru鍊錶的lru端(和上面不同,不是放在mru端)。這樣做的目的是為了使全表掃瞄的資料盡快被移出。因為全表掃瞄一般發生的頻率較低,並且全表掃瞄的資料塊大部分在以後都不會被經常使用到。

而如果你希望全表掃瞄的資料能被cache住,使之在掃瞄時放在mru端,可以通過在建立或修改表(或簇)時,指定cache引數。

邏輯讀是指從buffercache中讀取資料塊。可以分為即時讀(current read)和一致性讀(consistent read)。注意:邏輯io只有邏輯讀,沒有邏輯寫。

·                 即時讀

即時讀即讀取資料塊當前的最新資料。任何時候在buffer cache中都只有乙份當前資料塊。即時讀通常發生在對資料進行修改、刪除操作時。這時,程序會給資料加上行級鎖,並且標識資料為「髒」資料。

·                 一致性讀

oracle是乙個多使用者系統。當乙個會話開始讀取資料還未結束讀取之前,可能會有其他會話修改它將要讀取的資料。如果會話讀取到修改後的資料,就會造成資料的不一致。一致性讀就是為了保證資料的一致性。在buffer cache中的資料塊上都會有最後一次修改資料塊時的scn。如果乙個事務需要修改資料塊中資料,會先在回滾段中儲存乙份修改前資料和scn的資料塊,然後再更新buffer cache中的資料塊的資料及其scn,並標識其為「髒」資料。當其他程序讀取資料塊時,會先比較資料塊上的scn和自己的scn。如果資料塊上的scn小於等於程序本身的scn,則直接讀取資料塊上的資料;如果資料塊上的scn大於程序本身的scn,則會從回滾段中找出修改前的資料塊讀取資料。通常,普通查詢都是一致性讀。

查詢資料

在乙個查詢操作中,大量的讀操作都產生於資料的查詢過程中。減少查詢過程是我們優化io效能問題的重要目標。

下面介紹幾種主要的資料查詢方式。

·                 full table scan

當查詢條件無法命中任何索引、或者掃瞄索引的代價大於全表掃瞄代價的某一比例時(由引數optimizer_index_cost_adj設定),oracle會採用全表掃瞄的方式查詢資料。當發生全表掃瞄時,oracle會自下向上一次讀取一定數量(由引數db_file_multiblock_read_count

設定)的資料塊,一直讀取到高水位標誌(hwm,high water mark)下。full table scan會引起db file scattered read事件。

·                 index unique scan

全表掃瞄查詢資料的效率是非常低的。而索引能大幅提高查詢效率。普通索引的資料結構是b-tree,樹的葉子節點中包含資料的rowid,指向資料記錄,同時還有指標指向前乙個/後乙個葉子節點。索引掃瞄每次讀取乙個資料塊,索引掃瞄是「連續的」(sequential)。當索引為unique索引時,每個葉子節點只會指向一條資料。如果oracle能預知掃瞄結果只有0或1條記錄時,會採用index unique scan。當對unique index中的所有字段進行完全匹配時,會發生index unique scan。

index unique scan的查詢過程如下:

1.              從數的根節點資料塊開始查詢;

2.              查詢根節點塊中所有key值中大於或等於要查詢的值的最小key值;

3.              如果key值大於查詢值,則繼續查詢這個key值之前乙個key值所指向的子節點資料塊;

4.              如果key值等於查詢值,則繼續查詢這個key值所指向的子節點資料塊;

5.              如果沒有key值大於或等於查詢值,則繼續查詢最大key值所指向的子節點資料塊;

6.              如果繼續查詢的節點資料塊是數乙個分支節點,則重複2~4步;

7.              如果查詢的節點是葉子節點資料塊,則在資料塊中查詢等於查詢值的key值;

8.              如果找到相等的key值,則返回資料和rowid;

9.              如果沒找到相等的key值,則說明沒有符合條件的資料,返回null。

·                 index range scan

如果通過索引查詢資料時,oracle認為會返回資料可能會大於1,會進行index range scan,例如unique index中字段不完全匹配查詢時、非unique index查詢時。

index range scan分為閉包(有前後查詢邊界)和非閉包(只有一邊或者沒有邊界)。返回資料會依據索引增序排序,多個相同值則會按照rowid的增序排序。以下的查詢條件都是閉包的:

where column = 'value'

where column like 'value%'

where column between 'value1' and 'value2'

where column in ('value1', 'value2')

以下查詢條件非閉包:

where column < 'value1'

where column > 'value2'

閉包條件下的index range scan的查詢過程如下:

1.              從數的根節點資料塊開始查詢;

2.              查詢根節點塊中所有key值中大於或等於要查詢的起始值的最小key值;

3.              如果key值大於起始值,則繼續查詢這個key值之前乙個key值所指向的子節點資料塊;

4.              如果key值等於起始值,則繼續查詢這個key值所指向的子節點資料塊;

5.              如果沒有key值大於或等於起始值,則繼續查詢最大key值所指向的子節點資料塊;

6.              如果繼續查詢的節點資料塊是數乙個分支節點,則重複2~4步;

7.              如果查詢的節點是葉子節點資料塊,則在資料塊中大於或等於要查詢的起始值的最小key值;

8.              如果key值小於或等於結束值,則:如果所有key欄位都符合where字句中的查詢條件,則返回資料和rowid;否則繼續查詢當前葉子節點所指向的右邊的葉子節點。

index unique scan和index range scan都會引起db file sequential read事件。

·                 table access by indexrowid

當發生索引掃瞄時,如果需要返回的字段都在索引上,則直接返回索引上的資料,而如果還需要返回非索引上的字段的值,oracle則需要根據從索引上查詢的rowid到對應的資料塊上取回資料,這時就是table access by index rowid。

·                 index fast full scan& index full scan

索引快速全掃瞄和全表掃瞄類似,一次讀取db_file_multiblock_read_count個資料塊來描所有索引的葉子節點。index fast fullscan和其他索引掃瞄不同,它不會從樹的根節點開始讀取,而是直接掃瞄所有葉子節點;也不會一次讀取乙個資料塊,而是一次讀取db_file_multiblock_read_count個資料塊。index fast fullscan會引起db filescattered read事件。

在某些情況下,如db_file_multiblock_read_count值過小、強制使用索引掃瞄時,會發生index full scan。index full scan和index fast full scan不同,它是一種索引掃瞄,按照b-tree的查詢法從樹的根節點開始掃瞄,遍歷整棵樹,並且一次讀取乙個資料塊。它會引起db file sequential read事件。

oralce資料庫遞迴查詢的用法

首先我們可以新建乙個start demo表做測試案例 create table demo id varchar2 10 primary key,dsc varchar2 100 pid varchar2 10 插入幾條資料 insert into demo values 00001 中國 1 ins...

Oralce中備份,還原資料庫

一.使用ssh工具連線到linux伺服器上 1.1建立連線 1.2輸入連線屬性 1.3輸入密碼 1.4檢視伺服器上的檔案 1.5將dmp檔案打車zip包 打成zip格式的壓縮包,直接複製到伺服器的 home oracle目錄中 我習慣放在這個目錄,當然放到別的目錄也行 1.6切換目錄,找到檔案 1....

oralce資料庫索引

例如有如下表 test tbid name rowid 1zhangsan 0 1 2limei 1 2 3haungqing 0 3 如果在該表中不存在任何索引,那麼在查詢某一條記錄,例如姓名為limei的人,因為查詢到乙個後下面不確定是否還存在姓名為limei的人,因此會進行全表掃瞄查詢。而如果...