關於oracle資料庫讀取資料的三種方式

2021-09-19 11:02:44 字數 3786 閱讀 1664

開啟oracle sqldeveloper,連線到hr模式下的資料庫,在sql工作表中,執行如下語句:

create table wang(

name  varchar2(6),

id     number        );

然後向表中插入如下語句:

insert into wang values(『wang』,1);

insert into wang values(『cheng』,2);

insert into wang values(『zhou』,3);

insert into wang values(『he』,4);

commit;

在sqldeveloper查詢入下圖所示:

下面將分別介紹三種資料讀取方式:

1.通過全表掃瞄

在使用全表掃瞄的時候,利用多塊讀,oracle讀取表中的所有行,可以提高全表掃瞄的速度,可以大大的減少i/o的次數,是一種很好的讀取方法,通常採用全表掃瞄,但是讀取較大的表時,不建議採取全表掃瞄的方法。

那我們檢視下採取全表掃瞄先:

在sql工作表中執行

explain  plan  for  select  *  from  wang;

select  *  from  table(dbms_xplan.display);

如下圖:

發現第七行table  access  full了吧。

2.通過rowid

我們在對錶物件採取資料插入時,會隱含建立rowid,是64進製數,它是資料行所儲存的資料塊位址,所以我們可以通過查詢rowid可以快速查詢到我們想要查詢的資料。rowid中指出了物件編號,資料檔案編號,塊號,行號。那我們來看下到底什麼是rowid。

在sql工作表中執行

select  name,id ,rowid  from  wang;

如下圖所示:

rowid總共有十八位,以第一行的rowid為例:

aaasvp  aae  aaaakp  aaa

它是64進製數,我們來分析下rowid中各個字元代表什麼:

a~z 代表0~25

a~z  代表26~51

0~9  代表52~61

+    代表 62

/     代表 63

細心的讀者可以發現我把上面的十八位分成了四小組:

第一組(前六位):是代表物件的編號

第二組(三位):檔案編號

第三組(六位):塊編號

第四組(三位):行號

既然是十六進製制數,那我們轉換成十進位制數看看先(以物件編號為例):

aaasvp

0+0+0+18*64*64+ 21*64+ 41=75113

我們可以在檢視中查詢物件編號來驗證上面我們通過rowid計算得到的物件編號正確性。開啟sqlplus視窗,執行下面語句:

select object_name,data_object_id from dba_objects where object_name=』wang』;

結果如下圖:

通過上面的實驗,你是否理解rowid的含義了呢,同理,檔案編號,塊編號,行編號可以通過此方法得到驗證,讀者自己可以嘗試去實驗。

我們可以比較rowid和全表掃瞄哪個更快:

在sqldeveloper的sql工作表中執行:

explain  plan  for  select  *  from  wang  where  rowid=』aaasvp aae aaaakp aaa』;

select  *  from  table(dbms_xplan.display);

結果如下圖:

通過比較,通過rowid查詢資料是最快的。

3.通過索引

我們可以通過索引找到資料行的 rowid,然後通過rowid直接到表中查詢資料,這種方式為索引查詢或者稱為索引掃瞄。因為乙個rowid對應乙個資料行,所以這種方式是採用的單塊讀取。索引中不僅儲存索引值,還儲存相應的rowid。索引查詢分為兩步,掃瞄索引找到相應的rowid,人後找到對應的rowid然後從表中讀取相應的資料。每次都是單塊的i/o去讀,由於索引比較小,而且經常使用,一般會被快取到記憶體中,並且第一步通常是邏輯讀(資料可以從記憶體中得到),由於表資料較大,第二步通常為物理讀(邏輯讀的速度是大於物理讀取,物理讀效能比較低)。我們建立了索引,但是是否使用是oracle根據cbo優化器計算的結果選擇,普通使用者是無法干預的。

我們來做下實驗,訪問路徑走主鍵索引的查詢(此時已在sqldeveloper中把wang.id設為主鍵)。

在sqldeveloper中的sql工作表中執行以下語句:

explain plan for select * from wang where id=』1』;

select * from table(dbms_xplan.display);

結果如下圖:

由下圖我們可以看出訪問路徑走的是主鍵索引,所以你看到的是index unique scan,首先是索引掃瞄,然後是根據索引查詢到rowid進行表的訪問。

你也許會問,我們不是沒有建立索引嗎,怎麼會通過索引來查詢呢,因為我們在指定主鍵時,oracle會自動建立主鍵索引,是唯一索引。我們可以建立一般索引,唯一索引,位圖索引等。

完整語法:

create (unique|bitmap) index [使用者名稱.]索引名 on [使用者名稱.]表名 (列名 [ asc | desc], [列名 [ asc | desc]]...)

[ tablespace 表空間名 ]

[ pctfree 正整型數 ]

[ initrans 正整型數 ]

[ maxtrans 正整型數 ]

[ 儲存子句 ]

[ logging | nologging ]

[ nosort ]

oracle自動建立的主鍵索引是什麼樣的呢?那我們來看看先:

我們知道原來這個索引名字叫wang_pk,知道為什麼叫主鍵索引了吧,索引涉及到優化,不是我們建立了索引,就會使用索引,要根據優化器選擇。事物都有兩面性,它可以幫助我們快速找到想要的資料,但是在有些情況下會帶來效能開銷,不要認為使用索引就是好事。索引掃瞄有四種方式:唯一掃瞄,範圍掃瞄,全掃瞄,快速掃瞄,這裡不一一敘述。有時候我們建立了索引,我們也可以限制索引,如我們使用了函式,但是沒有建立基於該函式的索引。鑑於本人水平有限,索引涉及的內容遠遠超過這些,對有興趣的讀者可以更深入的了解索引。oracle是一座巨大礦山,值得學資料庫的你去探索,oracle中它真的很棒,從它的體系結構到很小的一部分可以說都做的很好,給我們帶來很大的方便,在這個多使用者的時代,它的優勢更加的顯著,市場占有率可以說明這一點。

C 讀取 修改Oracle資料庫

連線oracle的時候,需要在 nuget 中安裝 oracle.manageddataaccess.dll 讀取oracle的資料 id 配置資訊 data source description address protocol tcp host ip位址 port 埠號 connect data...

關於oracle資料庫解鎖

microsoft windows 版本 10.0.14393 c 2016 microsoft corporation。保留所有權利。c windows system32 sqlplus nolog sql plus release 10.2.0.1.0 production on 星期日 7月 ...

關於ORACLE建立資料庫索引

由於公司電子商務 平台版本老化,且使用oracle資料庫,前期dba在設計資料庫建表結構時候存在一定的問題,對索引的使用不夠重視,大致資料的查詢比較慢 當然也有一些由於使用hibernate中不夠重視 color red oracle採用自下而上的順序解 析where子句,根據這個原理,表之間的連線...