INDEX SKIP SCAN
1.交待一下背景:交易明細表,18億條資料,表的容量大小是:資料量有480G,聯合主鍵索引是112G。聯合主鍵索引是這樣建立的:
2.幾個語句的查詢花去時間和執行計劃讓人震驚。雖然資料量很大,18億,雖然資料量很大,表的容量有480G,索引有112G,但是仍然是0.1秒鐘查詢出資料,不得不說,用對了索引,效果相差很大。
這個是
我們來看下,上面執行計劃使用了index range scan來掃描,從18億資料中用時9秒,查出6條資料。
3.在來看下下面一個語句,使用index skip scan從18億資料中用時0.189秒,查出37條資料。對,你沒有看錯,的確是0.189秒,不是在記憶體中,你換其他卡號,依然是秒查詢出來。
注意下的是,0,367是分割槽表的起始分割槽和結束分割槽。這個分割槽表我分了367個分割槽。
4.雖然索引數量很大,要知道有112G。不是說它搜尋遍歷了112G索引,而是應該用了INDEX SKIP SCAN這種索引演算法得到結果。
5.INDEX SKIP SCAN跳躍式掃描適合於第一個列值重複比較多,第二個列唯一值比較多的情況
我們來看,我們建立了複合索引,用分割槽欄位PARTFLAG來做分割槽,每個分割槽有500萬資料,複合INDEX SKIP SCAN的第一個條件。而我們的語句還有一個查詢條件:card_inner_no='xxxx'.所以最佳化器就用了INDEX SKIP SCAN這種方式。
用hint強制資料庫使用INDEX SKIP SCAN,也是很快:
6.這還不能解釋,為什麼index range scan查詢需要9秒呢?
點選(此處)摺疊或開啟
-
alter table card_trade_detail
-
add constraint pk_card_trade_detail_local_1 primary key (PARTFLAG,card_inner_no, EXTERNAL_TRADE_CODE, card_counter, TRADE_VALUE, BEFORE_TRADE_CARD_BALANCE ,TRADE_TIME )
-
using index local nologging ;
2.幾個語句的查詢花去時間和執行計劃讓人震驚。雖然資料量很大,18億,雖然資料量很大,表的容量有480G,索引有112G,但是仍然是0.1秒鐘查詢出資料,不得不說,用對了索引,效果相差很大。
這個是
點選(此處)摺疊或開啟
-
select * from card_trade_detail d where d.partflag >= 108 and d.partflag<= 120
-
and card_inner_no='0000000007735534';
-
執行計劃
-
--------------------------------------------------------------------------------------------------------------
-
| Id | Operation | Name | Rows | Bytes | Cost | Time |
-
--------------------------------------------------------------------------------------------------------------
-
| 0 | SELECT STATEMENT | | 1 | 118 | 4 | 00:00:01 |
-
| 1 | PARTITION RANGE ITERATOR | | 1 | 118 | 4 | 00:00:01 |
-
| 2 | TABLE ACCESS BY LOCAL INDEX ROWID | CARD_TRADE_DETAIL | 1 | 118 | 4 | 00:00:01 |
-
| * 3 | INDEX RANGE SCAN | PK_CARD_TRADE_DETAIL_LOCAL_1 | 1 | | 3 | 00:00:01 |
-
--------------------------------------------------------------------------------------------------------------
-
-
Predicate Information (identified by operation id):
-
------------------------------------------
-
* 3 - access("D"."PARTFLAG">=108 AND "CARD_INNER_NO"='0000000007735534' AND "D"."PARTFLAG"<=120)
- * 3 - filter("CARD_INNER_NO"='0000000007735534')
3.在來看下下面一個語句,使用index skip scan從18億資料中用時0.189秒,查出37條資料。對,你沒有看錯,的確是0.189秒,不是在記憶體中,你換其他卡號,依然是秒查詢出來。
點選(此處)摺疊或開啟
-
select * from card_trade_detail d where d.partflag >= 0 and d.partflag<= 367
-
and card_inner_no='0000000007735534';
-
執行計劃
-
Plan Hash Value : 3925946279
-
-
---------------------------------------------------------------------------------------------------------------
-
| Id | Operation | Name | Rows | Bytes | Cost | Time |
-
---------------------------------------------------------------------------------------------------------------
-
| 0 | SELECT STATEMENT | | 20 | 2360 | 57493 | 00:11:30 |
-
| 1 | PARTITION RANGE ALL | | 20 | 2360 | 57493 | 00:11:30 |
-
| 2 | TABLE ACCESS BY LOCAL INDEX ROWID | CARD_TRADE_DETAIL | 20 | 2360 | 57493 | 00:11:30 |
-
| * 3 | INDEX SKIP SCAN | PK_CARD_TRADE_DETAIL_LOCAL_1 | 20 | | 57157 | 00:11:26 |
-
---------------------------------------------------------------------------------------------------------------
-
-
Predicate Information (identified by operation id):
-
------------------------------------------
-
* 3 - access("D"."PARTFLAG">=0 AND "CARD_INNER_NO"='0000000007735534' AND "D"."PARTFLAG"<=367)
- * 3 - filter("CARD_INNER_NO"='0000000007735534')
4.雖然索引數量很大,要知道有112G。不是說它搜尋遍歷了112G索引,而是應該用了INDEX SKIP SCAN這種索引演算法得到結果。
5.INDEX SKIP SCAN跳躍式掃描適合於第一個列值重複比較多,第二個列唯一值比較多的情況
我們來看,我們建立了複合索引,用分割槽欄位PARTFLAG來做分割槽,每個分割槽有500萬資料,複合INDEX SKIP SCAN的第一個條件。而我們的語句還有一個查詢條件:card_inner_no='xxxx'.所以最佳化器就用了INDEX SKIP SCAN這種方式。
用hint強制資料庫使用INDEX SKIP SCAN,也是很快:
點選(此處)摺疊或開啟
-
select/*+INDEX_SS(d PK_CARD_TRADE_DETAIL_LOCAL_1)*/ * from card_trade_detail d where d.partflag >= 108 and d.partflag<= 120
- and card_inner_no='0000000007735534'
6.這還不能解釋,為什麼index range scan查詢需要9秒呢?
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30393770/viewspace-2144423/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 理解index skip scanIndex
- [轉貼]Skip Scan IndexIndex
- 關於INDEX SKIP SCANIndex
- index range scan,index fast full scan,index skip scan發生的條件IndexAST
- 索引優化index skip scan索引優化Index
- INDEX SKIP SCAN適用場景Index
- oracle hint_skip scan_index_ssOracleIndex
- 高效的SQL(index skip scan使用條件)SQLIndex
- index skip scan的一些實驗。Index
- 跳躍式索引(Skip Scan Index)的淺析索引Index
- 跳躍式索引(Skip Scan Index)淺析 - 轉索引Index
- 【每日一摩斯】-Index Skip Scan Feature (212391.1)Index
- 跳躍式索引掃描(index skip scan) [final]索引Index
- INDEX UNIQUE SCAN,INDEX FULL SCAN和INDEX FAST FULL SCANIndexAST
- 【TUNE_ORACLE】列出走了INDEX SKIP SCAN的SQL參考OracleIndexSQL
- [20180725]index skip-scan operation.txtIndex
- rowid,index,INDEX FULL SCAN,INDEX FAST FULL SCAN|IndexAST
- Index Full Scan vs Index Fast Full ScanIndexAST
- Index Full Scan 與 Index Fast Full ScanIndexAST
- Index的掃描方式:index full scan/index fast full scanIndexAST
- INDEX FULL SCAN和INDEX FAST FULL SCAN區別IndexAST
- index full scan 和 index FAST full scan 區別IndexAST
- Index Full Scan 與 Index Fast Full Scan (Final)IndexAST
- INDEX FULL SCAN和INDEX FAST FULL SCAN的區別IndexAST
- Clustered Index Scan and Clustered Index SeekIndex
- [20181201]奇怪的INDEX SKIP SCAN執行計劃.txtIndex
- 【INDEX_SS】使用HINT使SQL用索引跳躍掃描(Index Skip Scan)方式快速獲取資料IndexSQL索引
- index full scan 和 index fast full scan (IFS,FFS)的不同IndexAST
- skip_unusable_index parameterIndex
- Index Unique Scan (213)Index
- PostgreSQL DBA(119) - pgAdmin(LIMIT:Index Scan vs Bitmap Index Scan)SQLMITIndex
- Index Full Scan和Index Fast Full Scan行為差異分析(上)IndexAST
- Index Full Scan和Index Fast Full Scan行為差異分析(下)IndexAST
- Index Range Scan (214)Index
- 【SQL 提示 之二】index_ss Index Skip HintSQLIndex
- 關於Oracle 9i 跳躍式索引掃描(Index Skip Scan)的小測試 (轉)Oracle索引Index
- index fast full scan 和 nullIndexASTNull
- Fast full index scan 淺析ASTIndex