零、概述
在這之前,一直都是使用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
這個里面,講解執行計划的順序的那部分可以參考下面的這個鏈接,講得更清楚一點。
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,並不是真的強制使用,所以可能會被優化器忽略(優化器有自己的內在邏輯)。
六、索引失效的可能原因
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;