Oracle 對某列的部分資料建立索引
Oracle 對某列的部分資料建立索引
--- 說明:案例來自《 收穫,不止SQL 優化 》
請問:Oracle 可以針對某列的部分資料建立索引嗎?比如 t1 表 id 列的資料有 1,2,3,4,5 。可以只針對 id=3 的資料建立索引嗎?
可以通過函式索引實現只針對id=3 的資料建立索引,例如 :
Create index i_t1_id on t(case when id=3 then 3 end);
請問:請舉一個具體案例,並說明在該場景下使用部分索引效能更好?
案例如下:
---建立測試表t
SQL > create table t ( id int , status varchar2 ( 2 ));
--建立普通索引
SQL > create index id_normal on t ( status );
-- 插入資料
SQL > insert into t select rownum , 'Y' from dual connect by rownum <= 100000 ;
SQL > insert into t select 1 , 'N' from dual ;
SQL > commit ;
---資料分佈
SQL > select count (*), status from t group by status ;
--- 收集統計資訊
SQL > analyze table t compute statistics for table for all indexes for all indexed columns ;
--- 查詢表 t ,檢視執行計劃
SQL > set linesize 1000
SQL > set autotrace traceonly
SQL > select * from t where status = 'N' ;
-- 查 看索引 資訊
SQL > set autotrace off
SQL > analyze index id_normal validate structure ;
SQL > select name , btree_space , lf_rows , height from index_stats ;
備註 : INDEX_STATS 儲存的是最近一次 ANALYZE INDEX ... VALIDATE STRUCTURE 語句的結果,最多隻有 當前會話的 一條資料 。
--- 建立函式索引的情況
SQL > drop index id_normal ;
SQL > create index id_status on t ( Case when status = 'N' then 'N' end );
SQL > analyze table t compute statistics for table for all indexes for all indexed columns ;
--- 再次檢視執行計劃
SQL > set autotrace traceonly
SQL > select * from t where ( case when status = 'N' then 'N' end )= 'N' ;
--觀察id_status索引的情況
SQL > set autotrace off
SQL > analyze index id_status validate structure ;
SQL > select name , btree_space , lf_rows , height from index_stats ;
--- 在對比下之前普通索引的值
結論: 普通索引改成函式索引後,索引當前分配的空間 (BTREE_SPACE) 由 20230168 降到 7996 , , 邏輯讀consistent gets 由 5 降到 2 ,索引葉子數 (LF_ROWS) 由 100001 降到 1 ,索引高度 (HEIGHT) 由 3 降到 1 ,效能有所提升。
歡迎關注我的微信公眾號"IT小Chen",共同學習,共同成長!!!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29785807/viewspace-2693912/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 僅對部分資料構建索引索引
- 資料庫的部分索引資料庫索引
- oracle資料庫建立、刪除索引等操作Oracle資料庫索引
- 資料庫之建立索引資料庫索引
- GBase 如何批量清空某資料庫中部分表的資料?資料庫
- Oracle大表快速建立索引Oracle索引
- Oracle如何建立B樹索引Oracle索引
- Oracle 41億資料量表建立索引記錄Oracle索引
- 資料庫——對索引的理解資料庫索引
- 【TUNE_ORACLE】列出SQL謂詞中需要建立索引的列SQL參考OracleSQL索引
- mongodb資料庫如何建立索引?MongoDB資料庫索引
- [20201110]oracle建立索引nosrt.txtOracle索引
- Oracle中的虛擬列索引-nosegment indexOracle索引Index
- oracle 資料庫對於多列求最大值Oracle資料庫
- 【TUNE_ORACLE】Oracle索引設計思想(二)索引過濾列概述Oracle索引
- 【STAT】Oracle 表統計資訊被鎖,如何建立索引Oracle索引
- 【TUNE_ORACLE】Oracle索引設計思想(一)索引片和匹配列概述Oracle索引
- 對存在空值的列建索引索引
- Oracle各種版本下“示例資料庫的建立”的建立Oracle資料庫
- Oracle資料庫中的不可見索引 invisible indexOracle資料庫索引Index
- Linux中 awk命令根據列的索引批次提取列的資料Linux索引
- 建立資料策略的6個關鍵組成部分
- [轉] Oracle資料庫中建立表時怎樣考慮列順序Oracle資料庫
- 聯合索引和多個單列索引使用中的索引命中情況及索引建立原則索引
- magento2 建立資料表及新增索引索引
- Mysql多列索引建立與優化.mdMySql索引優化
- 資料型別與函式索引-Oracle篇資料型別函式索引Oracle
- oracle的索引Oracle索引
- 利用 Pandas 將資料集中的某列文字拆分為多行
- ORACLE表統計資訊與列統計資訊、索引統計資訊Oracle索引
- oracle Mysql PostgreSQL 資料庫的對比OracleMySql資料庫
- 使用陣列建立分頁資料陣列
- oracle點陣圖索引對DML操作的影響Oracle索引
- 【TUNE_ORACLE】檢視錶,列和索引的統計資訊SQL參考Oracle索引SQL
- 【AWR】Oracle資料庫建立awr基線Oracle資料庫
- Oracle與GreatSQL差異:更改唯一索引列OracleSQL索引
- Oracle vs PG 索引資訊Oracle索引
- 使用SQL語言 替換資料庫某欄位內的部分內容SQL資料庫