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優化索引
- 最佳化你的系統--索引(一) 正確使用索引索引
- 圖解MySQL索引(三)—如何正確使用索引?圖解MySql索引
- 如何理解並正確使用 MySQL 索引MySql索引
- SQL最佳化案例-分割槽索引之無字首索引(六)SQL索引
- SQL最佳化案例一則--複合索引沒有被使用SQL索引
- SQLT 最佳化SQL 用複合索引代替單列索引的案例SQL索引
- SQL最佳化案例-自定義函式索引(五)SQL函式索引
- 使用SQL Profile進行SQL最佳化案例SQL
- 資料庫的效能調優:如何正確的使用索引?資料庫索引
- MySQL 調優之如何正確使用聯合索引MySql索引
- MySQL 5.6建索引的正確姿勢MySql索引
- SQL優化(二)(聯合索引的使用)SQL優化索引
- SQL最佳化案例-使用with as最佳化Subquery Unnesting(七)SQL
- 【恩墨學院】如何理解並正確使用MySql索引MySql索引
- Oracle SQL*Loader使用案例(二)OracleSQL
- SQL最佳化(一) 索引SQL索引
- 最佳化SQL Server索引的技巧SQLServer索引
- SQL Server 索引結構及其使用(二)SQLServer索引
- Mysql系列第二十三講 如何正確的使用索引?MySql索引
- 使用for迴圈批量註冊的事件不能正確獲取索引值事件索引
- PHP Opcache 的正確使用PHPopcache
- SQL Server 索引結構及其使用(二)[轉]SQLServer索引
- SQL Server 索引結構及其使用(一、二)SQLServer索引
- sql優化案例一:使用了表示式不會使用索引SQL優化索引
- 多語言架構下如何正確的使用SQL檢視架構SQL
- SQL效能最佳化之索引最佳化法SQL索引
- Redis的正確使用姿勢Redis
- 使用正確的工具(轉載)
- 正確高效使用 GoogleGo
- 正確使用rman crosscheckROS
- 解讀mysql的索引和事務的正確姿勢MySql索引
- SQL Server正確刪除Windows認證使用者的方法教程SQLServerWindows
- SQL最佳化案例-union代替or(九)SQL
- Oracle SQL 'or' 的最佳化,最近的案例一則。OracleSQL
- 正規表示式案例分析 (二)
- SQL優化案例一則--複合索引沒有被使用SQL優化索引