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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle點陣圖索引對DML操作的影響Oracle索引
- update表中index索引列對原索引條目做什麼操作?Index索引
- 16、MySQL Case-索引key對select count(*)的影響MySql索引
- 資料庫聚簇索引——not null條件對唯一鍵索引成為聚簇索引的影響資料庫索引Null
- mysql的DDL操作對業務產生影響測試MySql
- 表資料量影響MySQL索引選擇MySql索引
- unusable index對DML/QUERY的影響Index
- Nologging對恢復的影響(二)
- 語言對思維的影響
- Nologging對恢復的影響(一)
- 網線的分類與對網速的影響 網線對網速影響大嗎?
- 浮動的盒子對img的影響
- MybatisPlus中的update操作MyBatis
- 來電對播放音樂的影響
- python:super()對多繼承的影響Python繼承
- DB2 HADR對效能的影響DB2
- INDEX建立方式對SQL的影響IndexSQL
- 關於OPcache對Swoole影響的理解opcache
- 終端環境對go程式的影響?Go
- margin為負值對佈局的影響
- Sailthru:Facebook醜聞對人們的影響AI
- 網路延遲對事務的影響
- JVM 引數調整對 sortx 的影響JVM
- Mavrck:COVID-19對創作者的影響VR
- cluster factor對執行計劃的影響
- 淺談疫情對消費金融的影響
- 虛擬記憶體對 OI 的影響記憶體
- 修改系統時間對oracle的影響Oracle
- VideaHealth:人工智慧對牙科的真正影響Idea人工智慧
- windows server許可權對tomcat的影響WindowsServerTomcat
- namespace對axis解析xml請求的影響namespaceXML
- 資料庫的統計(select)確實會影響資料庫的更新(update)的資料庫
- 是什麼影響了資料庫索引選型?資料庫索引
- 深度評測丨 GaussDB(for Redis) 大 Key 操作的影響Redis
- MySQL alter 新增列對dml影響MySql
- 海外伺服器對SEO影響?伺服器
- Cirium:資料揭示新冠肺炎對中國航空業的影響及對全球航空旅遊增長的影響
- Git 分支策略與submodule對分支策略的影響Git
- 人工智慧對軟體測試的影響人工智慧