Update操作對索引的影響
對於update操作,索引將對原先的資料進行刪除標記,然後增加一條新的記錄,因此很多人,包括我在內,就有一個錯誤觀念:大批量的update更新操作,就可能造成索引儲存空間浪費,我們需要定期對索引進行重建。實際上,當leaf block被標記為刪除記錄的時候,這些空間能被ORACLE自動清除和重用。
以下是Richard Foote實驗步驟:
1、建立表和索引
SQL>create table test_update (id number,name varchar2(10));
SQL>create index test_update_idx on test_update(name);
SQL>insert into test_update values(1, 'BOWIE');
SQL>commit;
2、dump 索引資料塊
SQL>select header_file, header_block
from dba_segments
where segment_name='TEST_UPDATE_IDX'
HEADER_FILE HEADER_BLOCK
-------------------------- ---------------------------
6 3355
SQL>alter session set tracefile_identifier=yzb;
SQL>alter system dump datafile 6 block 3356;
檢視trace檔案:
..........
kdxconro 1 (該資料塊索引有1行)
..........
kdxlende 0 (該資料塊索引被刪除的是0行)
row#0[8017] flag: ------, lock: 2, len=15
col 0; len 5; (5): 42 4f 57 49 45
col 1; len 6; (6): 01 80 0d 17 00 00
3、update表的資料,並dump索引資料塊資訊
SQL>update test_update set name='ZIGG' where id=1;
SQL>commit;
SQL>alter system dump datafile 6 block 3356;
檢視trace檔案:
..........
kdxconro 2 (該資料塊索引有2行)
..........
kdxlende 1 (該資料塊索引被刪除的是1行)
row#0[8017] flag: ---D--, lock: 2, len=15 (標識為刪除)
col 0; len 5; (5): 42 4f 57 49 45
col 1; len 6; (6): 01 80 0d 17 00 00
row#1[8003] flag: ------, lock: 2, len=14
col 0; len 4; (4): 5a 49 47 47
col 1; len 6; (6): 01 80 0d 17 00 00
SQL>index test_update_idx validate structure;
SQL>select del_lf_rows from index_stats;
DEL_LF_ROWS
------------------
1
4、插入一個新的資料
SQL>insert into test_update value (2, 'PINK FLOYD');
SQL>commit;
SQL>alter system dump datafile 6 block 3356;
檢視trace檔案:
..........
kdxconro 2 (該資料塊索引有1行)
..........
kdxlende 0 (該資料塊索引被刪除的是0行)
row#0[7983] flag: ------, lock: 2, len=20
col 0; len 10; (10): 50 49 4e 4b 20 46 4c 4f 59 44
col 1; len 6; (6): 01 80 0d 17 00 01
row#1[8003] flag: ------, lock: 0, len=14
col 0; len 4; (4): 5a 49 47 47
col 1; len 6; (6): 01 80 0d 17 00 00
原先標記為刪除的行消失了。
SQL>analyze index test_update_idx validate structure;
SQL>select del_lf_rows from index_stats;
DEL_LF_ROWS
------------------
0
以下是Richard Foote實驗步驟:
1、建立表和索引
SQL>create table test_update (id number,name varchar2(10));
SQL>create index test_update_idx on test_update(name);
SQL>insert into test_update values(1, 'BOWIE');
SQL>commit;
2、dump 索引資料塊
SQL>select header_file, header_block
from dba_segments
where segment_name='TEST_UPDATE_IDX'
HEADER_FILE HEADER_BLOCK
-------------------------- ---------------------------
6 3355
SQL>alter session set tracefile_identifier=yzb;
SQL>alter system dump datafile 6 block 3356;
檢視trace檔案:
..........
kdxconro 1 (該資料塊索引有1行)
..........
kdxlende 0 (該資料塊索引被刪除的是0行)
row#0[8017] flag: ------, lock: 2, len=15
col 0; len 5; (5): 42 4f 57 49 45
col 1; len 6; (6): 01 80 0d 17 00 00
3、update表的資料,並dump索引資料塊資訊
SQL>update test_update set name='ZIGG' where id=1;
SQL>commit;
SQL>alter system dump datafile 6 block 3356;
檢視trace檔案:
..........
kdxconro 2 (該資料塊索引有2行)
..........
kdxlende 1 (該資料塊索引被刪除的是1行)
row#0[8017] flag: ---D--, lock: 2, len=15 (標識為刪除)
col 0; len 5; (5): 42 4f 57 49 45
col 1; len 6; (6): 01 80 0d 17 00 00
row#1[8003] flag: ------, lock: 2, len=14
col 0; len 4; (4): 5a 49 47 47
col 1; len 6; (6): 01 80 0d 17 00 00
SQL>index test_update_idx validate structure;
SQL>select del_lf_rows from index_stats;
DEL_LF_ROWS
------------------
1
4、插入一個新的資料
SQL>insert into test_update value (2, 'PINK FLOYD');
SQL>commit;
SQL>alter system dump datafile 6 block 3356;
檢視trace檔案:
..........
kdxconro 2 (該資料塊索引有1行)
..........
kdxlende 0 (該資料塊索引被刪除的是0行)
row#0[7983] flag: ------, lock: 2, len=20
col 0; len 10; (10): 50 49 4e 4b 20 46 4c 4f 59 44
col 1; len 6; (6): 01 80 0d 17 00 01
row#1[8003] flag: ------, lock: 0, len=14
col 0; len 4; (4): 5a 49 47 47
col 1; len 6; (6): 01 80 0d 17 00 00
原先標記為刪除的行消失了。
SQL>analyze index test_update_idx validate structure;
SQL>select del_lf_rows from index_stats;
DEL_LF_ROWS
------------------
0
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/354732/viewspace-605530/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- shrink 操作對索引的影響索引
- 分割槽表的不同操作對索引的影響索引
- oracle點陣圖索引對DML操作的影響Oracle索引
- CONTEXT索引對COMMIT操作的影響 (ZT)Context索引MIT
- 操作分割槽表對global和local索引的影響索引
- 【Oracle】-【COMMIT對索引的影響】-從trace看COMMIT對索引的影響OracleMIT索引
- 對列進行連線操作會影響索引的使用索引
- 物化檢視日誌對UPDATE的影響
- oracle分割槽表的常規操作導致對索引的影響Oracle索引
- Sql Server之旅——第十站 看看DML操作對索引的影響SQLServer索引
- shrink 與rebuild對索引高度的影響對比Rebuild索引
- 【Oracle】-【ROWNUM與索引】-索引對ROWNUM檢索的影響Oracle索引
- delete語句對索引的影響之分析delete索引
- 索引對直接路徑載入的影響索引
- 表資料的儲存對索引的影響索引
- 關於drop操作對role的影響
- stopkey對索引掃描的影響測試TopK索引
- 索引及排序對執行計劃的影響索引排序
- reverse index 對於 MAX/MIN操作的影響Index
- update表中index索引列對原索引條目做什麼操作?Index索引
- 在範圍分割槽表上分割槽維護操作對索引狀態的影響索引
- myisam對於update,insert,delete關於auto_incremant的影響deleteREM
- innodb對於update,insert,delete關於auto_incremant的影響deleteREM
- mysql刪除和更新操作對效能的影響MySql
- Nologging操作對standby的影響 (zt)
- DDL,DML操作對結果快取的影響快取
- 資料列not null對索引影響一例Null索引
- 16、MySQL Case-索引key對select count(*)的影響MySql索引
- oracle本地分割槽索引跨分割槽對成本的影響Oracle索引
- 在範圍分割槽表上分割槽維護操作對索引狀態的影響(1)索引
- Select for update/lock in share mode 對事務併發性影響
- 檢視insert,delete,update對基表的影響(檢視初識)delete
- 影響flashback table的操作!
- mysql的DDL操作對業務產生影響測試MySql
- 複合索引中前導列對sql查詢的影響索引SQL
- 資料庫聚簇索引——not null條件對唯一鍵索引成為聚簇索引的影響資料庫索引Null
- oracle 索引升降序及排序條件 對查詢計劃的影響Oracle索引排序
- 在範圍分割槽表上分割槽維護操作對全域性及本地索引狀態的影響(2)索引