oracle索引優化


零、概述

在這之前,一直都是使用mysql來進行開發或者部署。最近及今后很長一段時間都要使用oracle,今天和同事也遇到一個oracle 慢查詢問題。查了很多資料,這里記錄備忘。持續更新ing。。。

 

一、查看執行計划

EXPLAIN PLAN FOR 
待執行的sql;(不要忘了分號)
SELECT     * FROM     TABLE (dbms_xplan.display());
也可以使用下面這條,會顯示更多信息:
SELECT     * FROM     TABLE (dbms_xplan.display(null,null,'advanced'));

 可參考如下:

查看Oracle執行計划的幾種常用方法-系列1

https://blog.csdn.net/bisal/article/details/38919181

二、查看索引

1、根據表名查詢表上的索引

select 
b.uniqueness, a.index_name, a.table_name, a.column_name 
from all_ind_columns a, all_indexes b
where a.index_name=b.index_name 
and a.table_name = upper('DISPATCHTASKINFO')
order by a.table_name, a.index_name, a.column_position;

其中,DISPATCHTASKINFO為表名。

這個呢,一般工具都可以查看,只是有時候新加了索引,在查看執行計划的時候,總是因為各種各樣的原因沒有生效,這時候執行上述語句,看看我們的索引是否

加成功了。

 

2、根據索引名,查詢索引相關信息

select 
b.uniqueness, a.index_name, a.table_name, a.column_name 
from all_ind_columns a, all_indexes b
where a.index_name=b.index_name 
AND
a.index_name = 'SYS_C0011421'
order by a.table_name, a.index_name, a.column_position;

注:標紅為索引名字。

 

 

 

三、執行計划的執行順序

一般,一個執行計划可能是下面這樣的(在navicat for oracle中的執行效果):

 

 那么,要怎么去讀懂這個內容呢?

這邊我也是參考了幾個鏈接,寫得比我好,我就不班門弄斧了。

1、看懂Oracle執行計划

 https://www.cnblogs.com/Dreamer-1/p/6076440.html

這個里面,講解執行計划的順序的那部分可以參考下面的這個鏈接,講得更清楚一點。

 
2、ORACLE執行計划的步驟和順序
 https://blog.csdn.net/qshpeng/article/details/5820622

 

3、其中的 name 那一列,在部分情況下,即為索引的名字。可以根據第二節中的方法進行查詢。

 

ps:這里需要注意的是,上面是navicat for oracle中的執行效果。

可以看到,這里面縮進相當不明顯,可以換別的客戶端。

比如Oracle Sql Developer中的效果好得多:

 

四、優化器模式

http://blog.itpub.net/17203031/viewspace-705012/

 

 

五、強制使用索引

select /*+ index(TABLE_NAME,INDEX_NAME) */ 

from RECORD

where entityId='24' and entityType='blog';

在select后,添加類似於代碼注釋一樣的東西,其中的紅色標出來的部分,

TABLE_NAME寫要使用的索引的表名,INDEX_NAME為索引名。

但是,這個只是hint,並不是真的強制使用,所以可能會被優化器忽略(優化器有自己的內在邏輯)。

 

六、索引失效的可能原因

oracle 索引失效原因及解決方法

https://www.cnblogs.com/cxxjohnson/p/5836203.html

 

我這邊遇到的索引失效問題應該就是鏈接中提到的數據統計問題,后面執行了如下幾條語句后即可以用上我新增的索引:

analyze table INCIDENTINFORMATION compute statistics;

ANALYZE TABLE INCIDENTINFORMATION COMPUTE STATISTICS FOR ALL INDEXED COLUMNS;

analyze table INCIDENTINFORMATION compute statistics for table for all indexes for all indexed columns;

 

 基於我的理解,上面這幾條語句,會去 分析索引,索引無非是key--》value集合,其中,key是索引中包含的列(如果是組合索引,則是多個列),value就是數據所在的行的rowid的集合。
最終呢,會得到這樣的結果且被緩存起來:
指定一個索引,能知道對應的rowid集合是啥,集合的size多大(主要是后邊CBO優化器根據這個來判斷cost大小,選擇是否走該索引)。
 
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM