這篇文章主要介紹SQL優(yōu)化之如何使用索引,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
成都創(chuàng)新互聯(lián)公司成立與2013年,先為赤城等服務(wù)建站,赤城等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為赤城企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
下面 sql 30秒執(zhí)行出結(jié)果,查看 sql 謂詞中有 like ,我們知道謂詞中有這樣的語句是不走索引的(為了保護(hù)客戶的隱私,表名和部分列已經(jīng)重命名)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | SELECT /*+1*/
CHECKNUM AS PINGZBSM,
CHECKDATE,
XXXMODE,
XXXRESULT,
( SELECT RESULT
FROM ( select ID,to_char(WMSYS.WM_CONCAT(xxxnum||xxxtype||xxxmode||xxxresult)) RESULT
from OOOO_XXXCHECKLOG
WHERE CHECKDATE BETWEEN DATE '2018-05-04' AND DATE '2018-05-04' and xxxtype like '%PAR'
GROUP BY ID
) b where b.id=a.id
) RESULT,
CLERKNUM AS CHECKNUM
FROM OOO_XXXECHECKLOG A;
|

邏輯讀600多萬。查看索引情況如下

表過濾返回?cái)?shù)據(jù)量如下:
1 2 3 4 5 6 | SQL> select count (*) from OOOO_XXXCHECKLOG;
2799616
select count (*) from OOOO_XXXCHECKLOG WHERE CHECKDATE BETWEEN DATE '2018-05-04' AND DATE '2018-05-04' and xxxtype like '%PAR' ;
12856
select count (*) from OOOO_XXXCHECKLOG WHERE CHECKDATE BETWEEN DATE '2018-05-04' AND DATE '2018-05-04' ;
197984
|
通過查詢上面返回?cái)?shù)據(jù)可知,因?yàn)閤xxtype不走索引,所以通過索引要回表197984次,如果走了索引只回表12856次。
下面我們建立REVERSE索引IDX_ID_TYPE_RE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | SELECT /*+OOOO_XXXCHECKLOG index (IDX_ID_TYPE_RE) 2*/
CHECKNUM AS PINGZBSM,
CHECKDATE,
XXXMODE,
XXXRESULT,
( SELECT RESULT
FROM ( select ID,to_char(WMSYS.WM_CONCAT(xxxnum||xxxtype||xxxmode||xxxresult)) RESULT
from OOOO_XXXCHECKLOG
WHERE CHECKDATE BETWEEN DATE '2018-05-04' AND DATE '2018-05-04' and REVERSE(xxxtype) like 'RAP%'
GROUP BY ID
) b where b.id=a.id
) RESULT,
CLERKNUM AS CHECKNUM
FROM OOO_XXXECHECKLOG A;
|
查看執(zhí)行計(jì)劃如下,邏輯讀將為300萬,但是時(shí)間還是維持在 18 秒,根本原因在于這個(gè)索引因?yàn)闃?biāo)量子查詢的問題被訪問700 萬次導(dǎo)致。

下面我們改寫sql如下
1 2 3 4 5 6 7 8 9 10 11 12 13 | SELECT /*+ index (OOOO_XXXCHECKLOG IDX_ID_TYPE_RE) 3*/
CHECKNUM AS PINGZBSM,
CHECKDATE,
XXXMODE,
XXXRESULT,
B.RESULT,
CLERKNUM AS CHECKNUM
FROM OOO_XXXECHECKLOG A
left join ( select ID,to_char(WMSYS.WM_CONCAT(xxxnum||xxxtype||xxxmode||xxxresult)) RESULT
from OOOO_XXXCHECKLOG
WHERE CHECKDATE BETWEEN DATE '2018-05-04' AND DATE '2018-05-04' and REVERSE(xxxtype) like 'RAP%'
GROUP BY ID
) b on b.id=a.id;
|

執(zhí)行計(jì)劃中出現(xiàn)index_skip_scan。
下面我們創(chuàng)建如下索引:
1 | create index idx_date_seal_re on OOOO_XXXCHECKLOG(CHECKDATE,REVERSE(xxxtype));
|

可以看到,邏輯讀降到64424, 50 個(gè)物理讀是因?yàn)閯倓倓?chuàng)建索引的原因, sql 也秒出。
以上是“SQL優(yōu)化之如何使用索引”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)頁題目:SQL優(yōu)化之如何使用索引
轉(zhuǎn)載源于:
http://www.ef60e0e.cn/article/ghdphp.html