溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SQL優(yōu)化之如何使用索引

發(fā)布時(shí)間:2021-11-10 09:25:35 來源:億速云 閱讀:128 作者:小新 欄目:關(guān)系型數(shù)據(jù)庫

這篇文章主要介紹SQL優(yōu)化之如何使用索引,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

下面 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;

SQL優(yōu)化之如何使用索引

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

SQL優(yōu)化之如何使用索引

表過濾返回?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優(yōu)化之如何使用索引

下面我們改寫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;

SQL優(yōu)化之如何使用索引

執(zhí)行計(jì)劃中出現(xiàn)index_skip_scan。 

下面我們創(chuàng)建如下索引:

1

create index idx_date_seal_re on OOOO_XXXCHECKLOG(CHECKDATE,REVERSE(xxxtype));

SQL優(yōu)化之如何使用索引

可以看到,邏輯讀降到64424, 50 個(gè)物理讀是因?yàn)閯倓倓?chuàng)建索引的原因, sql 也秒出。

以上是“SQL優(yōu)化之如何使用索引”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

sql
AI