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