浏览 5447 次
锁定老帖子 主题:Oracle 高水位线的一点研究
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-02-03
高水位线实验: -- 创建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了, 一点心得, 记录下来。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-08-12
感谢楼主的详细分析和实验,这比看书强多了!!!
|
|
返回顶楼 | |