開啟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子句,根據這個原理,表之間的連線...