oracle 索引回表,oracle 索引简单总结
建立索引時先進行排序,邏輯上分為Root(根塊),Branch(莖塊),leaf(葉子塊)。leaf中存在索引列的值、長度、和所在rowid,莖塊存了指向具體莖塊的指針,root塊同理。這是邏輯上的劃分實際上根據表中數據量的多少可能會存在多層,但是索引整體上層次較低,例如一張500G的表數據量達到幾百億條,這時候它的索引只有6層。
在查詢結果返回多的情況下使用索引會浪費更多的代價,另外如果一張表有五個字段,我們在三個字段上建上btree索引。那樣效率只會更低??煽紤]使用位圖索引
索引的三大特點:
1.索引數的高度一般較低
2.索引由索引列存儲的值及rowid組成
索引SELECT?*?FROM?T?WHERE?ID?=?1會導致索引回表的產生,若不需要看全部數據可用SELECT?ID?FROM?T?WHERE?ID=?1或可建多列的復核索引,但是復核索引最好不要超過3列的復核。在更新操作不頻繁的情況下可考慮使用索引組織表
3.索引本身是有序的
減少ORDER?BY、DISTINCT排序所浪費的COST
聚合因子:
建立索引的列的順序與索引自動排序的列的順序的不對應度被稱為聚合因子,聚合因子越大索引回表讀越浪費時間(索引回表讀不可避免的情況下)
oracle?執行計劃分類:
1、TABLE?ACCESS?FULL???全表掃描
2、INDEX?FAST?FULL?SCAN???索引快速掃描???(不考慮排序COUNT(ID),?SUM(ID),?AVG(ID),列必須非空或IS?NOT?NULL)
3、INDEX?FULL?SCAN???索引全掃???(SELECT?ID?FROM?T?WHERE?ID?=?120)
4、INDEX?FULL?SCAN(MIN/MAX)??最大值最小值索引全掃??(SELECT?MAX(ID)?FROM?T)
5、TABLE?ACCESS?BY?INDEX?ROWID??索引回表讀???(SELECT?*?FROM?T?WHERE?ID?=?1)
6、INDEX?RANGE?SCAN???索引范圍掃描???(SELECT?*?FROM?T?WHERE?ID?
7、BITMAP?INDEX?FAST?FULL?SCAN??位圖索引快速掃描??(不考慮排序COUNT(ID),?SUM(ID),?AVG(ID),位圖快速索引掃描速度非??鞂⒔瞧胀ㄋ饕陌俦?列不必非空)
btree索引優化簡介
T表??字段:OBJECT_ID,?OBJECT_NAME
單列索引:
CREATE?INDEX?IDX1_OBJECT_ID?ON?T(OBJECT_ID);
COUNT(*)、SUM、AVG優化:
改為COUNT(OBJECT_ID)查詢,但是必須保證OBJECT_ID列非空。可用如下方法告知oracle可走IDX1_OBJECT_ID索引:
1、SELECT?COUNT(OBJECT_ID)?FROM?T?WHERE?OBJECT_ID?IS?NOT?NULL;
2、設置字段非空
MAX/MIN優化:
根據第三個特性有序排列,所以MAX/MIN的查詢代價會非常小。
SELECT?MAX(OBJECT_ID)?FROM?T;?不需加上IS?NOT?NULL;?使用執行計劃:INDEX?FULL?SCAN(MIN/MAX);
ORDER?BY、DISTINCT排序優化:
SELECT?*?FROM?T?WHERE?OBJECT_ID?
未建立索引的情況下會進行排序產生TEMPSPC;
建立索引的情況下不需要產生排序?會使用IDX1_OBJECT_ID索引
位圖索引
創建語法:
CREATE?BITMAP?INDEX?IDX_BITM_T_STATUS?ON?T(STATUS);
適用在更新非常少的表,建立在重復度較高的列(性別)
存儲結構:
位圖索引存儲的是比特位值
函數索引:
CREATE?TABLE?T?AS?SELECT?*?FROM?DBA_OBJECT;
CREATE?INDEX?IDX_OBJECT_ID?ON?T(OBJECT_ID);
CREATE?INDEX?IDX_OBJECT_NAME?ON?T(OBJECT_NAME);
CREATE?INDEX?IDX_CREATED?ON?T(CREATED);
SELECT?*?FROM?T?WHERE?UPPER(OBJECT_NAME)?=?'T';
普通的BTREE索引,如果在對列做運算的條件下是無法使用索引查詢的,會使用TABLE?ACCESS?FULL;
創建語句:
CREATE?INDEX?IDX_UPPER_OBJ_NAME?ON(UPPER(OBJECT_NAME));
SELECT?INDEX_NAME,?INDEX_TYPE?FROM?USER_INDEXES?WHERE?TABLE_NAME?=?'T';
函數索引的TYPE是:FUNCTION-BASED?NORMAL;
函數索引的cost比全表掃描要小,但是比普通的索引要大的多。
SELECT?*?FROM?T?WHERE?OBJECT_ID?-?10<30;
這時候如果在object_id列建立普通索引時無法使用的。oracle會默認使用全表掃描的方式進行查詢??捎幸韵聝蓚€思路進行優化:
1、SELECT?*?FROM?T?WHERE?OBEJCT_ID?
2、在OBJECT_ID?-?10上建立函數索引
寫sql時要注意規范,很多語句是等價的。
SELECT?*?FROM?T?WHERE?SUBSTR(OBJECT_NAME,1,4)?=?'CLUS'???=????SELECT?*?FROM?T?WHERE?OBJECT_NAME?LIKE?'CLUS%';
SELECT?*?FROM?T?WHERE?TRUNC(CREATED)?>=?TO_DATE('2012-10-02',?'YYYY-MM-DD')?AND?TRUNC(CREATED)?<=?TO_DATE('2012-10-03','YYYY-MM-DD')
=
SELECT?*?FROM?T?WHERE?CREATED?>=?TO_DATE('2012-10-02',?'YYYY-MM-DD')?AND?CREATED?
;
總結
以上是生活随笔為你收集整理的oracle 索引回表,oracle 索引简单总结的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 小米笔记本Pro 2022用上手机同款技
 - 下一篇: 下载超8500万次 国产OS深度入选“全