天天看點

利用reverse索引優化like語句的方法詳解

在有一些情況下,開發同學經常使用like去實作一些業務需求,當使用like時,我們都知道使用like 前%(like ‘%111’)這種情況是無法使用索引的,那麼如何優化此類的SQL呢,下面是一個案例。

原SQL如下:

利用reverse索引優化like語句的方法詳解

pcc_cust_infonew 表索引如下

利用reverse索引優化like語句的方法詳解

執行設計如下:

利用reverse索引優化like語句的方法詳解

這裡可以看到SQL執行3.96秒,執行計劃中也可以發現PCC_CUST_INFONEW表走TABLE ACCESS FULL掃描,傳回約380k的資料,然後再與PCC_CUST_CONTRACTCOMPANY表主鍵PK_PCC_CUST_CONTRACTCOMPANY走INDEX UNIQUE SCAN,這裡慢主要是執行計劃中為3的這一步。

我們也都知道在Oracle中,當使用like時,如果是後%(like ‘138%’)是可以使用索引的,如果是前%(like ‘%138’)是無法正常使用索引。那麼如何讓前%也可以使用到索引呢,答案是可以使用reverse索引的形式進行優化。

優化如下: 

修改索引

利用reverse索引優化like語句的方法詳解

将SQL調整為

利用reverse索引優化like語句的方法詳解

按以上調整後,SQL執行效率提升到毫秒級。

利用reverse索引優化like語句的方法詳解

調整後的執行計劃如下:

利用reverse索引優化like語句的方法詳解

那使用reverse函數索引後,到底是如何做到可以使用索引了呢,當你看到執行計劃下面的謂詞資訊想必你就知道答案了,

利用reverse索引優化like語句的方法詳解

其實就是使用reverse函數索引将索引資料反轉,SQL中的where條件中将值反轉,這樣就将前%改為後%。