update表中index索引列對原索引條目做什麼操作?
update表中index索引列對原索引條目做什麼操作?
--將原索引條目刪除,然後再插入新值條目。
實驗驗證:
方法:透過修改index列值後,檢視index碎片的變化
--建立table測試 CREATE TABLE MES1.T_OBJECT AS SELECT * FROM DBA_OBJECTS WHERE ROWNUM<=20000; --當前20000筆資料 SELECT COUNT(1) FROM MES1.T_OBJECT; 20000 --建立index CREATE INDEX MES1.IDX_OWNER ON MES1.T_OBJECT(OWNER); --當前index使用大小 SELECT SEGMENT_NAME,BYTES,BLOCKS FROM DBA_SEGMENTS WHERE SEGMENT_NAME='IDX_OWNER' SEGMENT_NAME BYTES BLOCKS IDX_OWNER 458752 56
update index列前索引的使用狀況
--使用ANALYZE INDEX ... VALIDATE STRUCTURE可分析index具體使用情況和是否有壞塊, 注意執行不使用online話會產生鎖,阻塞DML analyze index MES1.IDX_OWNER validate structure; --分析結果可透過index_stats檢視 select NAME,BLOCKS,DEL_LF_ROWS,LF_ROWS,DEL_LF_ROWS/LF_ROWS from index_stats; NAME BLOCKS DEL_LF_ROWS LF_ROWS DEL_LF_ROWS/LF_ROWS IDX_OWNER 56 0 20000 0 --BLOCKS: Blocks allocated to the segment,index segment使用56個block --DEL_LF_ROWS: Number of deleted leaf rows in the index,索引中被刪除的葉子行數,當前沒有刪除所以是0 --LF_ROWS: Number of leaf rows,葉子總行數,為建表時的20000 --DEL_LF_ROWS/LF_ROWS:index中被刪除行佔總行數的百分比, 即碎片數(如果用del_lf_rows_len/lf_rows_len更準確),這裡沒有刪除行所以為0
update index列
--修改10000筆索引列值 UPDATE MES1.T_OBJECT SET OWNER='TESTUIDX' WHERE ROWNUM<=10000; commit;
update index列後索引的使用狀況
--再次分析index使用狀況 analyze index MES1.IDX_OWNER validate structure; select NAME,BLOCKS,DEL_LF_ROWS,LF_ROWS,DEL_LF_ROWS/LF_ROWS from index_stats; select * from index_stats NAME BLOCKS DEL_LF_ROWS LF_ROWS DEL_LF_ROWS/LF_ROWS IDX_OWNER 112 10000 30000 0.333333333333333 --BLOCKS: 增加到了112 --DEL_LF_ROWS: update後索引中被刪除的葉子行數變為10000,說明update會將原來索引條目行刪除 --LF_ROWS: 葉子總行數變為30000, --進一步證實是刪除了10000行,但index中之前空間並沒有釋放,再加上update後新插入的10000,也就是30000了 --DEL_LF_ROWS/LF_ROWS:因為update被刪除的行產生的碎片為10000/30000,正好為0.333333333333333
以上是針對update時的情況,delete時實際是一樣機制,這裡不做驗證。
結論:
在update更新index索引列操作時是 將原索引條目刪除,再插入新值條目。
所以在有頻繁對table索引列update和delete
table操作的,可以使用
ANALYZE INDEX ... VALIDATE STRUCTURE定期分析index,
並執行alter index...
rebuild,shrink,coalesce之類整理索引碎片
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25583515/viewspace-2686842/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ElasticSearch 倒排索引(Inverted Index)| 什麼是倒排索引?Elasticsearch索引Index
- Oracle中的虛擬列索引-nosegment indexOracle索引Index
- MySQL中為什麼要使用索引合併(Index Merge)?MySql索引Index
- 聯合索引和多個單列索引使用中的索引命中情況及索引建立原則索引
- Elasticsearch之索引模板index template與索引別名index aliasElasticsearch索引Index
- 什麼索引算是好的索引索引
- openGauss 列存表PSort索引索引
- MySQL索引那些事:什麼是索引?為什麼加索引就查得快了?MySql索引
- pandas(3):索引Index/MultiIndex索引Index
- 【INDEX】Postgresql索引介紹IndexSQL索引
- 【原創】MySQL 模擬條件索引MySql索引
- 什麼是索引索引
- index_oracle索引梳理系列及分割槽表梳理IndexOracle索引
- 什麼是行儲存和列儲存?正排索引和倒排索引?MySQL既不是倒排索引,也索引MySql
- MySQL 索引覆蓋(Covering Index)MySql索引Index
- 索引與null(一):單列索引索引Null
- 什麼情況下需要建立索引? 索引的作用?為什麼能夠提高查詢速度?(索引的原理) 索引有什麼副作用嗎?索引
- 對存在空值的列建索引索引
- openGauss Index-advisor_索引推薦Index索引
- MongoDB系列--輕鬆應對面試中遇到的MongonDB索引(index)問題MongoDB面試索引Index
- Elasticsearch 中為什麼選擇倒排索引而不選擇 B 樹索引Elasticsearch索引
- Oracle資料庫中的不可見索引 invisible indexOracle資料庫索引Index
- SQLServer索引優化(2):對於索引中include的理解SQLServer索引優化
- 資料庫聚簇索引——not null條件對唯一鍵索引成為聚簇索引的影響資料庫索引Null
- MySQL索引(二):建索引的原則MySql索引
- mysql字首索引是什麼MySql索引
- 什麼是覆蓋索引?索引
- 我面試幾乎必問:你設計索引的原則是什麼?怎麼避免索引失效?面試索引
- 【INDEX】Oracle 索引常見知識梳理IndexOracle索引
- 【SqlServer】管理全文索引(FULL TEXT INDEX)SQLServer索引Index
- 一條唯一索引索引
- MySQL 生成列索引MySql索引
- MYSQL索引為什麼這麼快?瞭解索引的神奇之處MySql索引
- oracle全文索引之同步和優化索引做了什麼Oracle索引優化
- MySQL通過通用列索引來提供一個JSON列索引MySql索引JSON
- 從InnoDB 索引執行簡述 聚集索引和非聚集索引、覆蓋索引、回表、索引下推索引
- mysql唯一索引是什麼MySql索引
- Oracle 對某列的部分資料建立索引Oracle索引