關於Oracle表訪問方式的總結

目錄

一、簡介

二、全表掃描(TABLE ACCESS FULL)

三、通過ROWID訪問表(TABLE ACCESS BY ROWID)

四、索引掃描(TABLE ACCESS BY INDEX SCAN)

五、參考資料


一、簡介

Oracle訪問表中記錄主要有下面三種方式:

  1. 全表掃描(TABLE ACCESS FULL);
  2. 通過ROWID訪問表(TABLE ACCESS BY ROWID);
  3. 索引掃描(TABLE ACCESS BY INDEX SCAN);

下面結合示例分別對三種訪問方式進行詳解。

二、全表掃描(TABLE ACCESS FULL)

概念:Oracle順序訪問數據表中的每一條記錄,並檢查每條記錄是否滿足where指定的過濾條件。在表很大的情況下,不太建議使用全表掃描,效率很低,除非查詢出來的記錄數比較多(超過總量的5% -- 10%),才考慮使用全表掃描,否則全表掃描就是我們進行優化的一個關鍵點。

實現機制:ORACLE採用一次讀入多個數據塊(database block)的方式優化全表掃描,而不是隻讀取一個數據塊,這極大的減少了I/O總次數,提高了系統的吞吐量,所以利用多塊讀的方法可以十分高效地實現全表掃描。

示例:

explain plan for select * from zhxg_xsxx_xsjbxx t where instr(t.XM,'張') > 0;

select * from table(dbms_xplan.display);

執行計劃:

通過執行計劃,可以看到上面訪問zhxg_xsxx_xsjbxx的方式就是全表掃描TABLE ACCESS FULL,針對每條記錄比較姓名中是否包含“張”。在日常工作中,我們要儘量減少全表掃描,在進行SQL優化的時候,全表掃描就是一個優化點,考慮是否能夠增加一些索引來優化查詢。

三、通過ROWID訪問表(TABLE ACCESS BY ROWID)

概念:ROWID是由Oracle自動加在表中每行最後的一列僞列,既然是僞列,就說明表中並不會物理存儲ROWID的值;我們可以像使用其它列一樣使用它,只是不能對該列的值進行增、刪、改操作;一旦一行數據插入後,則其對應的ROWID在該行的生命週期內是唯一的,即使發生行遷移,該行的ROWID值也不變。每一個表都有一個ROWID列,一個ROWID值用於唯一確定數據庫表中的的一條記錄。ROWID表示了該行所在的數據文件、數據塊以及行在該塊中的位置,通過ROWID我們可以快速定位到目標數據上,通過ROWID訪問是Oracle存取單行數據的最快方法。

通過ROWID訪問表的這種方式又分爲單個ROWID和多個ROWID兩種情況:

單個ROWID示例:

--先查詢出rowid
--select t.rowid,t.* from zhxg_xsxx_xsjbxx t;

explain plan for select t.rowid,t.* from zhxg_xsxx_xsjbxx t where t.rowid = 'AABUJXAACAAALCEAAA';
select * from table(dbms_xplan.display);

執行計劃:

多個ROWID示例:

--先查詢出多個rowid
--select t.rowid,t.* from zhxg_xsxx_xsjbxx t;

explain plan for select t.rowid,t.* from zhxg_xsxx_xsjbxx t where t.rowid in ('AABUJXAACAAALCEAAA', 'AABUJXAACAAALCEAAB','AABUJXAACAAALCEAAC');
select * from table(dbms_xplan.display);

執行計劃:

 可以看到,上面的執行計劃中出現了INLIST ITERATOR,即INLIST迭代,該操作說明其子操作多次重複時,會出現該操作。迭代操作意味着條件中的對象列表一個接一個的迭代傳遞給子操作。

四、索引掃描(TABLE ACCESS BY INDEX SCAN)

概念:通過索引查找到數據對應的rowid值(對於非唯一索引可能返回多個rowid值),然後根據rowid直接從表中得到具體的數據,這種查找方式稱爲索引掃描或索引查找(index lookup)。

實現機制:

索引掃描可以由2步組成:

  •  (1) 掃描索引得到對應的rowid值;
  •  (2) 通過找到的rowid從表中讀出具體的數據;

Oracle中提供了五種索引掃描的方式:

  1. 索引唯一掃描(index unique scan);
  2. 索引範圍掃描(index range scan);
  3. 索引全掃描(index full scan);
  4. 索引快速掃描(index fast full scan);
  5. 索引跳躍掃描(index skip scan);

關於索引掃描的詳細介紹,之前有一篇文章已經詳解介紹過了,可以參考這篇文章學習:https://blog.csdn.net/Weixiaohuai/article/details/106577668

五、參考資料

更多關於Oracle數據表訪問方式的文章,可以參考下面:

https://www.cnblogs.com/liuqiongliu/archive/2011/03/31/2000876.html

https://blog.csdn.net/leshami/article/details/7474308

https://www.cnblogs.com/xwdreamer/archive/2012/06/13/2547825.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章