Oracle 高水位線的一點研究
最近學習了一陣子Oracle, 感覺Oracle真的是博大精深, 包括Oralce記憶體結構,效能調整,資料備份等都不簡單, 這些對開發也很重要, 下面把做的Oracle高水位線的一些實驗貼出來, 方便以後Review:
高水位線實驗:
-- 建立test3表
SQL> create table test3 as
2 select * from dba_objects where 1 = 2;
Table created
-- 檢視錶中分配塊,區大小
SQL> SELECT segment_name, segment_type, blocks -- 分配資料塊數, extents -- 分配區塊數
2 FROM dba_segments
3 WHERE segment_name = 'TEST3'
4 ;
SEGMENT_NAME SEGMENT_TYPE BLOCKS EXTENTS
-------------------------------------------------------------------------------- ------------------ ---------- ----------
TEST3 TABLE 8 1
TEST3 TABLE 8 1
-- 分析表TEST3表
SQL> ANALYZE TABLE TEST3 ESTIMATE STATISTICS;
Table analyzed
-- 查詢TEST3表高水位線
SQL> SELECT blocks -- 高水位線(佔用TEST3表資料塊數), empty_blocks -- TEST3表空閒塊數, num_rows
2 FROM user_tables
3 WHERE table_name = 'TEST3';
BLOCKS EMPTY_BLOCKS NUM_ROWS
---------- ------------ ----------
0 7 0
-- 因為未向TEST3表中插入任何資料,因此此表的高水位線為0,現向TEST3表中插入資料再觀察
SQL> insert into test3
2 select * from dba_objects;
50361 rows inserted
SQL> commit;
Commit complete
-- 重新分析表
SQL> ANALYZE TABLE TEST3 ESTIMATE STATISTICS;
Table analyzed
-- 再次檢視錶中分配塊,區大小
SQL> SELECT segment_name, segment_type, blocks, extents
2 FROM dba_segments
3 WHERE segment_name = 'TEST3'
4 ;
SEGMENT_NAME SEGMENT_TYPE BLOCKS EXTENTS
-------------------------------------------------------------------------------- ------------------ ---------- ----------
TEST3 TABLE 8 1
TEST3 TABLE 768 21
此時看到BLOCKS數已增長到768, 也就是Oracle分配給TEST3表768個資料塊,21個區
-- 再次檢視TEST3表高水位線
SQL> SELECT blocks, empty_blocks, num_rows
2 FROM user_tables
3 WHERE table_name = 'TEST3';
BLOCKS EMPTY_BLOCKS NUM_ROWS
---------- ------------ ----------
689 78 50361
已增長到689個塊, 還有78個空閒塊,689 + 78 = 767, 比分配的少1個資料塊,是因為這一個資料塊是用作segment header
-- 現將TEST3表delete,在檢視高水位線
SQL> delete from test3;
50361 rows deleted
SQL> commit;
Commit complete
SQL> ANALYZE TABLE TEST3 ESTIMATE STATISTICS;
Table analyzed
SQL>
SQL> SELECT blocks, empty_blocks, num_rows
2 FROM user_tables
3 WHERE table_name = 'TEST3';
BLOCKS EMPTY_BLOCKS NUM_ROWS
---------- ------------ ----------
689 78 0
發現此表高水位線並未減少,證明delete只是刪除表中資料塊的記錄,但並不會使表中的高水位線下降, 在進行全表掃描時會Oracle會掃描表中高水位線下的所有資料塊,
因此資料雖然被刪除了,但查詢時有可能還是很慢。所以在進行大表刪除時應使用truncate語句,看下面實驗:
SQL> truncate table test3;
Table truncated
SQL> ANALYZE TABLE TEST3 ESTIMATE STATISTICS;
Table analyzed
SQL>
SQL> SELECT blocks, empty_blocks, num_rows
2 FROM user_tables
3 WHERE table_name = 'TEST3';
BLOCKS EMPTY_BLOCKS NUM_ROWS
---------- ------------ ----------
0 7 0
現在表中高水位下降到0了, 一點心得, 記錄下來。
高水位線實驗:
-- 建立test3表
SQL> create table test3 as
2 select * from dba_objects where 1 = 2;
Table created
-- 檢視錶中分配塊,區大小
SQL> SELECT segment_name, segment_type, blocks -- 分配資料塊數, extents -- 分配區塊數
2 FROM dba_segments
3 WHERE segment_name = 'TEST3'
4 ;
SEGMENT_NAME SEGMENT_TYPE BLOCKS EXTENTS
-------------------------------------------------------------------------------- ------------------ ---------- ----------
TEST3 TABLE 8 1
TEST3 TABLE 8 1
-- 分析表TEST3表
SQL> ANALYZE TABLE TEST3 ESTIMATE STATISTICS;
Table analyzed
-- 查詢TEST3表高水位線
SQL> SELECT blocks -- 高水位線(佔用TEST3表資料塊數), empty_blocks -- TEST3表空閒塊數, num_rows
2 FROM user_tables
3 WHERE table_name = 'TEST3';
BLOCKS EMPTY_BLOCKS NUM_ROWS
---------- ------------ ----------
0 7 0
-- 因為未向TEST3表中插入任何資料,因此此表的高水位線為0,現向TEST3表中插入資料再觀察
SQL> insert into test3
2 select * from dba_objects;
50361 rows inserted
SQL> commit;
Commit complete
-- 重新分析表
SQL> ANALYZE TABLE TEST3 ESTIMATE STATISTICS;
Table analyzed
-- 再次檢視錶中分配塊,區大小
SQL> SELECT segment_name, segment_type, blocks, extents
2 FROM dba_segments
3 WHERE segment_name = 'TEST3'
4 ;
SEGMENT_NAME SEGMENT_TYPE BLOCKS EXTENTS
-------------------------------------------------------------------------------- ------------------ ---------- ----------
TEST3 TABLE 8 1
TEST3 TABLE 768 21
此時看到BLOCKS數已增長到768, 也就是Oracle分配給TEST3表768個資料塊,21個區
-- 再次檢視TEST3表高水位線
SQL> SELECT blocks, empty_blocks, num_rows
2 FROM user_tables
3 WHERE table_name = 'TEST3';
BLOCKS EMPTY_BLOCKS NUM_ROWS
---------- ------------ ----------
689 78 50361
已增長到689個塊, 還有78個空閒塊,689 + 78 = 767, 比分配的少1個資料塊,是因為這一個資料塊是用作segment header
-- 現將TEST3表delete,在檢視高水位線
SQL> delete from test3;
50361 rows deleted
SQL> commit;
Commit complete
SQL> ANALYZE TABLE TEST3 ESTIMATE STATISTICS;
Table analyzed
SQL>
SQL> SELECT blocks, empty_blocks, num_rows
2 FROM user_tables
3 WHERE table_name = 'TEST3';
BLOCKS EMPTY_BLOCKS NUM_ROWS
---------- ------------ ----------
689 78 0
發現此表高水位線並未減少,證明delete只是刪除表中資料塊的記錄,但並不會使表中的高水位線下降, 在進行全表掃描時會Oracle會掃描表中高水位線下的所有資料塊,
因此資料雖然被刪除了,但查詢時有可能還是很慢。所以在進行大表刪除時應使用truncate語句,看下面實驗:
SQL> truncate table test3;
Table truncated
SQL> ANALYZE TABLE TEST3 ESTIMATE STATISTICS;
Table analyzed
SQL>
SQL> SELECT blocks, empty_blocks, num_rows
2 FROM user_tables
3 WHERE table_name = 'TEST3';
BLOCKS EMPTY_BLOCKS NUM_ROWS
---------- ------------ ----------
0 7 0
現在表中高水位下降到0了, 一點心得, 記錄下來。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-2121534/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 對Oracle高水位線的研究實踐Oracle
- oracle 高水位線及如何有效的降低高水位線Oracle
- 一、oracle 高水位線詳解Oracle
- oracle的高水位線HWMOracle
- oracle的高水位線(HWM)Oracle
- ORACLE 高水位線(HWM)Oracle
- oracle 回收高水位線Oracle
- Oracle 降低高水位線Oracle
- oracle回收高水位線Oracle
- 降低Oracle高水位線的方法Oracle
- Oracle的高水位線介紹Oracle
- oracle高水位線處理Oracle
- Oracle之降低高水位線Oracle
- oracle 高水位線詳解Oracle
- Oracle表段中的高水位線HWMOracle
- oracle表碎片以及整理(高水位線)Oracle
- Oracle高水位Oracle
- ORACLE資料庫降低高水位線方法Oracle資料庫
- Oracle delete 高水位線處理問題Oracledelete
- Oracle高水位線(HWM)及效能優化Oracle優化
- oracle回收高水位Oracle
- Oracle 高水位(HWM)Oracle
- Oracle案例10——HWM(高水位線)效能優化Oracle優化
- oracle高水位問題Oracle
- oracle11g表的高水位線hwm與dbms_space系列一Oracle
- oracle 高水位分析處理Oracle
- Oracle 高水位(HWM)標記Oracle
- delete與高水位線HWM回收delete
- 關於高水位線和deletedelete
- ORACLE的簡單處理高水位Oracle
- ORACLE高水位表的查詢方法Oracle
- 深入瞭解oracle的高水位(HWM)Oracle
- 高水位線、行遷移行連結
- Oracle 找出需要回收高水位的表Oracle
- Oracle表段中高水位線HWMOracle
- Enq : HW-contention高水位線的擴充套件競爭ENQ套件
- 關於高水位的知識
- Oracle 高水位查詢和處理方法彙總Oracle