日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle 索引回表,oracle 索引简单总结

發布時間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 索引简单总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。