共計(jì) 2027 個(gè)字符,預(yù)計(jì)需要花費(fèi) 6 分鐘才能閱讀完成。
這篇文章主要介紹 SQL 優(yōu)化之如何使用索引,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
下面 sql 30 秒執(zhí)行出結(jié)果,查看 sql 謂詞中有 like ,我們知道謂詞中有這樣的語(yǔ)句是不走索引的(為了保護(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 多萬(wàn)。查看索引情況如下
表過濾返回?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)?xxxtype 不走索引,所以通過索引要回表 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 萬(wàn),但是時(shí)間還是維持在 18 秒,根本原因在于這個(gè)索引因?yàn)闃?biāo)量子查詢的問題被訪問 700 萬(wàn)次導(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)注丸趣 TV 行業(yè)資訊頻道!