SQL最佳化案例-正確的使用索引(二)
下面sql 30秒執行出結果,檢視sql謂詞中有like,我們知道謂詞中有這樣的語句是不走索引的(為了保護客戶的隱私,表名和部分列已經重新命名)。
點選(此處)摺疊或開啟
-
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多萬。檢視索引情況如下
表過濾返回資料量如下:
點選(此處)摺疊或開啟
-
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
透過查詢上面返回資料可知,因為xxxtype不走索引,所以透過索引要回表197984次,如果走了索引只回表12856次。
下面我們建立REVERSE索引IDX_ID_TYPE_RE
點選(此處)摺疊或開啟
-
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;
檢視執行計劃如下,邏輯讀將為300萬,但是時間還是維持在18秒,根本原因在於這個索引因為標量子查詢的問題被訪問700萬次導致。
下面我們改寫sql如下
點選(此處)摺疊或開啟
-
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;
執行計劃中出現index_skip_scan。
下面我們建立如下索引:
點選(此處)摺疊或開啟
- create index idx_date_seal_re on OOOO_XXXCHECKLOG(CHECKDATE,REVERSE(xxxtype));
可以看到,邏輯讀降到64424,50個物理讀是因為剛剛建立索引的原因,sql也秒出。
| 作者簡介
姚崇·沃趣科技高階資料庫技術專家
熟悉Oracle資料庫內部機制,豐富的資料庫及RAC叢集層故障診斷、效能調優、OWI、資料庫備份恢復及遷移經驗。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31480736/viewspace-2155529/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL優化案例-正確的使用索引(二)SQL優化索引
- Oracle優化案例-正確的使用索引(二)Oracle優化索引
- SQL最佳化案例-分割槽索引之無字首索引(六)SQL索引
- 圖解MySQL索引(三)—如何正確使用索引?圖解MySql索引
- SQL最佳化案例-自定義函式索引(五)SQL函式索引
- 資料庫的效能調優:如何正確的使用索引?資料庫索引
- SQL最佳化案例-使用with as最佳化Subquery Unnesting(七)SQL
- 最佳化SQL Server索引的技巧SQLServer索引
- MySQL 調優之如何正確使用聯合索引MySql索引
- MySQL 5.6建索引的正確姿勢MySql索引
- Mysql系列第二十三講 如何正確的使用索引?MySql索引
- 在分割槽表上使用正確的索引來提高效能索引
- SQL效能最佳化之索引最佳化法SQL索引
- PHP Opcache 的正確使用PHPopcache
- SQL Server正確刪除Windows認證使用者的方法教程SQLServerWindows
- SQL優化案例-分割槽索引之無字首索引(六)SQL優化索引
- 解讀mysql的索引和事務的正確姿勢MySql索引
- SQL最佳化案例-union代替or(九)SQL
- ThreadLocal的正確使用與原理thread
- TiDB 的正確使用姿勢TiDB
- Redis的正確使用姿勢Redis
- Android中Handler的正確使用Android
- Hive SQL語句的正確執行順序HiveSQL
- MySQL SQL最佳化 - 覆蓋索引(covering index)MySql索引Index
- 正確高效使用 GoogleGo
- 小程式點睛之二:小程式使用 Iconfont 的正確姿勢
- 正確理解memcached,才能更好的使用
- laravel 使用 es 的正確姿勢Laravel
- 使用列舉的正確姿勢
- Protobuf在Cmake中的正確使用
- 使用快取的正確姿勢快取
- SQL優化案例-自定義函式索引(五)SQL優化函式索引
- SQL最佳化案例-單表分頁語句的最佳化(八)SQL
- 使用sql tuning advisor最佳化sqlSQL
- 正規表示式案例分析 (二)
- 如何正確使用ping呢
- Postman 正確使用姿勢Postman
- 如何正確使用 Slim 框架框架