通常我們會選擇在合適的謂詞條件列添加索引,以達到加速查詢的效果。今天給大家介紹下以orderby列創建索引加速查詢的例子,話不多說,往下看。
首先我們利用dba_objects創建一個測試表如下:
create table test as select * from dba_objects; --執行多次插入,讓數據量達到千萬級別 insert into test select * from test; |
案例一
表創建好后執行如下語句:
select* from (select * from test order by object_id) where rownum<=20; |
執行計劃如下圖,可以看到走的是全表掃描,執行時間17.58s。這也是意料之中的。
當然我們已經說了今天介紹的是以orderby列創建索引加速查詢的例子,先把索引建上:
createindex index_tt on test(object_id); |
再次執行上述語句,發現執行計劃仍是全表掃描,sql執行效率沒有任何變化。在這里我們修改下object_id列的屬性為非空:
altertable test modify object_id not null; |
然后執行上述語句,執行計劃如下圖,可以發現現在使用到了我們剛剛創建的索引,sql執行時間只需0.13s,sql執行效率大幅提升。
案例二
在實際生產中我們遇到的sql要比案例一復雜的多,接下來我們看一個復雜一點的案例:
selectobject_id,object_type from (select * from test where object_type like%TABLE% order by object_id) where rownum<=20; |
案例二中sql加了where條件,且我們可以條件的object_type列的選擇性非常差,不適合建立索引。執行上述語句后執行計劃如下,仍然使用到了我們剛剛建立在orderby列的索引。
那么這條語句還有沒有優化空間呢,我們嘗試在object_id和object_type列建立復合索引如下:
createindex index_tt1 on test(object_id,object_type); |
再次執行上述案例語句,執行計劃走了剛剛創建的復合索引,執行效率也所有提升。
總結
索引是有序的,而當sql中有order by時,可以考慮在order by字段列建立索引以提高語句執行效率;
在Oracle中null被定義為無限大,且null不等于null,故在索引中不會存有與null值對應的條目,在上述案例中如果不修改object_id列屬性為not null,優化器無法確定該列是否有null值,優化器仍然會選擇全表掃描;
當語句比較復雜且帶謂詞條件時,可以結合order by列建立復合索引。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/130040.html
閱讀 1346·2023-01-11 13:20
閱讀 1684·2023-01-11 13:20
閱讀 1132·2023-01-11 13:20
閱讀 1858·2023-01-11 13:20
閱讀 4100·2023-01-11 13:20
閱讀 2704·2023-01-11 13:20
閱讀 1385·2023-01-11 13:20
閱讀 3597·2023-01-11 13:20