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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Update操作對索引的影響索引
- ElasticSearch 倒排索引(Inverted Index)| 什麼是倒排索引?Elasticsearch索引Index
- Oracle中的虛擬列索引-nosegment indexOracle索引Index
- 什麼是index的leading column(索引的前導列)?Index索引
- MySQL中為什麼要使用索引合併(Index Merge)?MySql索引Index
- 兩列複合索引中(交換索引中列的順序),選索引的原則是?因為索引名字ascii碼小?索引ASCII
- index索引Index索引
- 索引組織表(Index Organizied Table)索引Index
- 【INDEX】注意:不可見索引在表DML操作過程中依然被維護Index索引
- 聯合索引和多個單列索引使用中的索引命中情況及索引建立原則索引
- 唯一性索引(Unique Index)與普通索引(Normal Index)差異(中)索引IndexORM
- goldengate 目的端同步無主鍵無索引表時的rpt日誌(做update操作)Go索引
- 分割槽索引之本地(local index)索引和全域性索引(global index)索引Index
- 索引組織表(index organized table ,IOT)索引IndexZed
- MySQL索引那些事:什麼是索引?為什麼加索引就查得快了?MySql索引
- 【INDEX】重建索引的兩條參考依據Index索引
- 不可見索引(invisible index)在表DML操作過程中依然被維護索引Index
- 點陣圖索引(Bitmap Index)——索引共用索引Index
- Elasticsearch之索引模板index template與索引別名index aliasElasticsearch索引Index
- 分割槽表的不同操作對索引的影響索引
- Mysql——index(索引)使用MySqlIndex索引
- oracle index索引原理OracleIndex索引
- mysql 索引( mysql index )MySql索引Index
- 【原創】MySQL 模擬條件索引MySql索引
- zt_Index Operation索引操作內部細節Index索引
- SQL Server 索引和表體系結構(包含列索引)SQLServer索引
- 操作分割槽表對global和local索引的影響索引
- 什麼是行儲存和列儲存?正排索引和倒排索引?MySQL既不是倒排索引,也索引MySql
- shrink 操作對索引的影響索引
- 對列進行連線操作會影響索引的使用索引
- 【INDEX】11g中利用不可見索引降低索引維護時對系統的衝擊Index索引
- oracle全文索引之About_INDEX_THEMES操作Oracle索引Index
- 【原創】MySQL 模擬條件索引薦MySql索引
- 【INDEX】Postgresql索引介紹IndexSQL索引
- pandas(3):索引Index/MultiIndex索引Index
- 什麼情況下需要建立索引? 索引的作用?為什麼能夠提高查詢速度?(索引的原理) 索引有什麼副作用嗎?索引
- 唯一性索引(Unique Index)與普通索引(Normal Index)差異(上)索引IndexORM
- 唯一性索引(Unique Index)與普通索引(Normal Index)差異(下)索引IndexORM