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/31542492/viewspace-2156227/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle優化案例-正確的使用索引(二)Oracle優化索引
- SQL最佳化案例-正確的使用索引(二)SQL索引
- Oracle效能優化-SQL優化(案例二)Oracle優化SQL
- SQL優化案例-分割槽索引之無字首索引(六)SQL優化索引
- SQL優化案例-自定義函式索引(五)SQL優化函式索引
- 資料庫的效能調優:如何正確的使用索引?資料庫索引
- MySQL 調優之如何正確使用聯合索引MySql索引
- SQL優化案例-使用with as優化Subquery Unnesting(七)SQL優化
- Oracle某行系統SQL優化案例(二)OracleSQL優化
- 圖解MySQL索引(三)—如何正確使用索引?圖解MySql索引
- Oracle效能優化-SQL優化(案例一)Oracle優化SQL
- Oracle效能優化-SQL優化(案例三)Oracle優化SQL
- Oracle效能優化-SQL優化(案例四)Oracle優化SQL
- SQL優化之利用索引排序SQL優化索引排序
- MySQL SQL優化案例(一)MySql優化
- OGG複製程式延遲高,優化方法二(存在索引),SQL選擇不好的索引優化索引SQL
- SQL最佳化案例-分割槽索引之無字首索引(六)SQL索引
- Oracle優化案例-join列索引缺失導致的sql效能問題(二十六)Oracle優化索引SQL
- SQL優化案例-union代替or(九)SQL優化
- mysql索引的使用和優化MySql索引優化
- 使用Elasticsearch的動態索引和索引優化Elasticsearch索引優化
- 對SQLServer錯誤使用聚集索引的優化案例(千萬級資料量)SQLServer索引優化
- Oracle優化案例-分割槽索引之無字首索引(六)Oracle優化索引
- mysql優化 | 儲存引擎,建表,索引,sql的優化建議MySql優化儲存引擎索引
- 【譯】Web 效能優化: 使用 Webpack 分離資料的正確方法Web優化
- 資料庫效能優化-索引與sql相關優化資料庫優化索引SQL
- 宜信DBA實踐-SQL優化|一篇文章說清楚Oracle Hint的正確使用姿勢SQL優化Oracle
- SQL優化案例-單表分頁語句的優化(八)SQL優化
- MySQL 5.6建索引的正確姿勢MySql索引
- MySQL資料SQL優化中,索引不被使用的典型場景總結MySql優化索引
- SQL最佳化案例-自定義函式索引(五)SQL函式索引
- 《MySQL慢查詢優化》之SQL語句及索引優化MySql優化索引
- Oracle優化案例-自定義函式索引(五)Oracle優化函式索引
- SQL優化之統計資訊和索引SQL優化索引
- SQL精華總結索引型別優化SQL優化事務大表優化思維導圖❤️SQL索引型別優化
- Oracle 某行系統SQL優化案例(一)OracleSQL優化
- Oracle某行系統SQL優化(案例五)OracleSQL優化
- Oracle某行系統SQL優化案例(三)OracleSQL優化