Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7699
  • 博文数量: 2
  • 博客积分: 50
  • 博客等级: 民兵
  • 技术积分: 30
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-30 12:58
文章分类
文章存档

2011年(2)

我的朋友
最近访客

分类: 数据库开发技术

2011-09-01 10:24:19

-- 创建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
阅读(826) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~