Oracle數據庫的優化--索引

本文主要講述索引的基本用發和查看索引的執行–(執行計劃)

最近lz寫平臺在測試的時候遇到,點擊菜單加載非常慢。因爲樓主展示的信息量較大,每組1萬左右。
求教得到優化的方式,可以加快數據庫的查詢速度—數據庫的索引

什麼是數據庫索引

索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息。如果想按特定職員的姓來查找他或她,則與在表中搜索所有的行相比,索引有助於更快地獲取信息。
索引的一個主要目的就是加快檢索表中數據的方法,亦即能協助信息搜索者儘快的找到符合限制條件的記錄ID的輔助數據結構。

索引是對數據庫表中一個或多個列(例如,employee 表的姓名 (name) 列)的值進行排序的結構。
例如這樣一個查詢:select * from table1 where id=10000。如果沒有索引,必須遍歷整個表,直到ID等於10000的這一行被找到爲止;有了索引之後(必須是在ID這一列上建立的索引),即可在索引中查找。由於索引是經過某種算法優化過的,因而查找次數要少的多。可見,索引是用來定位的。
從數據搜索實現的角度來看,索引也是另外一類文件/記錄,它包含着可以指示出相關數據記錄的各種記錄。其中,每一索引都有一個相對應的搜索碼,字符段的任意一個子集都能夠形成一個搜索碼。這樣,索引就相當於所有數據目錄項的一個集合,它能爲既定的搜索碼值的所有數據目錄項提供定位所需的各種有效支持
其主要目的就是加快查詢速度
但是加了索引後,在增上改時,除數據外還要對索引進行操作。所以在數據量較少時不建議使用索引

lz主要用在點擊查詢當前彙總信息所對應的明細,使用到的索引。使用的pl/sql工具
比較常見的就是對where子句的條件添加索引:

--創建索引
create idnex tablename_字段名1 on table(字段名1);
create idnex tablename_字段名1_字段名2 on table(字段名1,字段名2);--此爲多重索引
--lz用到的
create index detailed_batchnumber on detailed(batchnumber);

F8一下索引就創建成功了

執行計劃

索引創建成功,去平臺試了一下,果然快樂很多,但是該如何查看索引呢?
就引出了另外的知識–執行計劃

什麼事執行計劃:
執行計劃是一條查詢語句在Oracle中的執行過程或訪問路徑的描述
lz使用的pl/SQL查看的執行計劃,也可以用toad查看。
查看執行計劃有兩種方式,

第一種

選中sql語句點擊F5進行查看
這裏寫圖片描述
根據Operation縮進來判斷,縮進最多的最先執行;(縮進相同時,最上面的最先執行)
可點擊上面的三角號進行查看執行順序
同一級如果某個動作沒有子ID就最先執行
同一級的動作執行時遵循最上最右先執行的原則

使用這種方法需要配置查看執行計劃的展示數據:

工具 —> 首選項 —> 窗口類型 —> 計劃窗口 —> 根據需要配置要顯示在執行計劃中的列

這裏寫圖片描述

第二種查看方式

-- 查看執行計劃----可使用f5,查看
EXPLAIN PLAN FOR
SELECT * FROM detailed WHERE batchnumber='1000112017112715080570286110';
select * from table(dbms_xplan.display);
--三行代碼,第一三行固定,第二行是你要查看執行計劃的語句

這裏寫圖片描述

上面顯示的信息爲執行代碼所得到的執行計劃
上圖中 TABLE ACCESS BY … 即描述的是該動作執行時表訪問(或者說Oracle訪問數據)的方式;

表訪問的幾種方式:(非全部)
TABLE ACCESS FULL(全表掃描)
TABLE ACCESS BY ROWID(通過ROWID的表存取)
TABLE ACCESS BY INDEX SCAN(索引掃描)

1 TABLE ACCESS FULL(全表掃描):
Oracle會讀取表中所有的行,並檢查每一行是否滿足SQL語句中的 Where 限制條件;
全表掃描時可以使用多塊讀(即一次I/O讀取多塊數據塊)操作,提升吞吐量;
使用建議:數據量太大的表不建議使用全表掃描

2 TABLE ACCESS BY ROWID(通過ROWID的表存取) :
先說一下什麼是ROWID?
ROWID是由Oracle自動加在表中每行最後的一列僞列,既然是僞列,就說明表中並不會物理存儲ROWID的值;

你可以像使用其它列一樣使用它,只是不能對該列的值進行增、刪、改操作;

一旦一行數據插入後,則其對應的ROWID在該行的生命週期內是唯一的,即使發生行遷移,該行的ROWID值也不變。

讓我們再回到 TABLE ACCESS BY ROWID 來:

行的ROWID指出了該行所在的數據文件、數據塊以及行在該塊中的位置,所以通過ROWID可以快速定位到目標數據上,這也是Oracle中存取單行數據最快的方法;

3 TABLE ACCESS BY INDEX SCAN(索引掃描):
在索引塊中,既存儲每個索引的鍵值,也存儲具有該鍵值的行的ROWID。

索引掃描其實分爲兩步:

Ⅰ:掃描索引得到對應的ROWID

Ⅱ:通過ROWID定位到具體的行讀取數據
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章