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-2693908/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 僅對部分資料構建索引索引
- 資料庫的部分索引資料庫索引
- oracle資料庫建立、刪除索引等操作Oracle資料庫索引
- 【資料庫使用-oracle索引的建立和分類】二資料庫Oracle索引
- 【資料庫使用-oracle索引的建立和分類】一資料庫Oracle索引
- mysql匯出某個表的部分資料MySql
- 在Oracle中列出指定資料表的全部索引列Oracle索引
- 資料列not null對索引影響一例Null索引
- ORACLE 9i資料庫優化案例(3) --- 低相異值的列也可以建立索引Oracle資料庫優化索引
- 資料庫建立索引的原則資料庫索引
- 資料庫之建立索引資料庫索引
- GBase 如何批量清空某資料庫中部分表的資料?資料庫
- 資料庫——對索引的理解資料庫索引
- oracle 索引的建立與管理Oracle索引
- 如何用exp 匯出 某個表的某幾列資料
- solr總結 第五部分:solr為資料庫建立索引Solr資料庫索引
- mongodb資料庫如何建立索引?MongoDB資料庫索引
- 為資料庫建立索引(轉)資料庫索引
- 兩表中某列的資料差異
- MYSQL 匯出資料庫中某張表的部分數…MySql資料庫
- Oracle 找出需要建立索引的表Oracle索引
- oracle中檢視某個表的索引是否有效Oracle索引
- 【Oracle】-【建立索引】-建立索引的操作原理與一些體會Oracle索引
- Oracle中檢視某個表的建立時間 - [Oracle]Oracle
- Oracle 41億資料量表建立索引記錄Oracle索引
- ORACLE 9i資料庫優化案例(2) --- 單列索引變複合索引的優化Oracle資料庫優化索引
- 【TUNE_ORACLE】列出SQL謂詞中需要建立索引的列SQL參考OracleSQL索引
- mysql資料庫索引的建立以及效能測試MySql資料庫索引
- 【Oracle】-【索引】先查資料再建索引,還是先建索引再插資料?Oracle索引
- Oracle如何建立B樹索引Oracle索引
- Oracle大表快速建立索引Oracle索引
- oracle 繁忙時候建立索引Oracle索引
- oracle 建立所有分割槽索引Oracle索引
- 建立資料策略的6個關鍵組成部分
- linux對檔案某列求和Linux
- Oracle對索引分析的優化Oracle索引優化
- oracle 資料庫對於多列求最大值Oracle資料庫
- 索引資料列傾斜度(skew)問題索引