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索引
- SQL優化(二)(聯合索引的使用)SQL優化索引
- Oracle效能優化-SQL優化(案例二)Oracle優化SQL
- sql優化案例一:使用了表示式不會使用索引SQL優化索引
- 最佳化你的系統--索引(一) 正確使用索引索引
- SQL優化案例-分割槽索引之無字首索引(六)SQL優化索引
- SQL優化案例一則--複合索引沒有被使用SQL優化索引
- 資料庫的效能調優:如何正確的使用索引?資料庫索引
- sql優化之多列索引的使用SQL優化索引
- MySQL 調優之如何正確使用聯合索引MySql索引
- SQL優化案例-自定義函式索引(五)SQL優化函式索引
- 優化案例--重建索引引發的sql效能問題優化索引SQL
- SQL優化-索引SQL優化索引
- 使用SQL Profile進行SQL優化案例SQL優化
- Oracle某行系統SQL優化案例(二)OracleSQL優化
- SQL優化案例-使用with as優化Subquery Unnesting(七)SQL優化
- 圖解MySQL索引(三)—如何正確使用索引?圖解MySql索引
- SQL Server索引優化系列之二:索引效能考慮 (轉)SQLServer索引優化
- 效能優化案例-SQL優化優化SQL
- 如何理解並正確使用 MySQL 索引MySql索引
- 一個複合索引的優化案例索引優化
- 聊聊索引和SQL優化索引SQL優化
- SQL優化--函式索引SQL優化函式索引
- Oracle效能優化-SQL優化(案例一)Oracle優化SQL
- Oracle效能優化-SQL優化(案例三)Oracle優化SQL
- Oracle效能優化-SQL優化(案例四)Oracle優化SQL
- 【DBAplus】SQL優化:一篇文章說清楚Oracle Hint的正確使用姿勢SQL優化Oracle
- MySQL SQL優化案例(一)MySql優化
- SQL效能優化案例分析SQL優化
- sql語句的優化案例分析SQL優化
- SQL優化之利用索引排序SQL優化索引排序
- 【譯】Web 效能優化: 使用 Webpack 分離資料的正確方法Web優化
- 對SQLServer錯誤使用聚集索引的優化案例(千萬級資料量)SQLServer索引優化
- mysql索引的使用和優化MySql索引優化
- Oracle優化案例-分割槽索引之無字首索引(六)Oracle優化索引
- 使用Elasticsearch的動態索引和索引優化Elasticsearch索引優化
- SQL優化案例-union代替or(九)SQL優化