当前位置:  数据库>oracle

Oracle数据库表是否需要碎片整理

    来源: 互联网  发布时间:2017-06-23

    本文导语: 近日有mysql的朋友问我 Oracle数据库的表是否需要定期进行碎片整理,由于Oracle的数据表的存储。不像mysql(innodb)那样使用的聚集组织表(IOT)存放数据,而是使用的是称为堆(HEAP)的方式来存放数据。数据行被存放到的块是随机的....

近日有mysql的朋友问我 Oracle数据库的表是否需要定期进行碎片整理,由于Oracle的数据表的存储。不像mysql(innodb)那样使用的聚集组织表(IOT)存放数据,而是使用的是称为堆(HEAP)的方式来存放数据。数据行被存放到的块是随机的.进行全表扫描的时候读取出来的数据行没有按一定的方式进行排序.所以Oracle可以对任意有空闲空间的数据块进行数据插入。

假设我们现在创建一个表,过程如下.

SQL> create table t2 as select * from dba_objects;

Table created.

SQL> exec dbms_stats.gather_table_stats('SYS','T2');

PL/SQL procedure successfully completed.

得到当前的表的数据块,行信息

SQL> select table_name,num_rows,blocks,num_rows/blocks from dba_tables where table_name='T2' and owner='SYS';

TABLE_NAME NUM_ROWS    BLOCKS NUM_ROWS/BLOCKS

------------------------------ ---------- ---------- ---------------

T2    90426 1535  59.9094463

当前该表拥有90426行,1535个数据块,平均每个块大概是存放了59行数据.

我们通过如下的PLSQL代码来摸拟随机删除10000条数据;

SQL> declare

i number;

begin

for i in 1..10000 loop

delete from t2 where object_id=round(dbms_random.value(0,90000));

end loop;

commit;

end;

PL/SQL procedure successfully completed.

SQL> exec dbms_stats.gather_table_stats('SYS','T2');

PL/SQL procedure successfully completed.

SQL> select table_name,num_rows,blocks,num_rows/blocks from dba_tables where table_name='T2' and owner='SYS';

TABLE_NAME NUM_ROWS    BLOCKS NUM_ROWS/BLOCKS

------------------------------ ---------- ---------- ---------------

T2    81413 1535  53.037785

删除10000行后,表的数据块不发生变化,但是平均每个块是存放53行数据.

现在摸拟随机插入数据

SQL> declare

i number;

begin

for i in 1..10000 loop

insert into t2(OWNER, OBJECT_NAME, SUBOBJECT_NAME, OBJECT_ID, DATA_OBJECT_ID, OBJECT_TYPE, CREATED, LAST_DDL_TIME, TIMESTAMP, STATUS, TEMPORARY,

GENERATED, SECONDARY, NAMESPACE, EDITION_NAME, SHARING, EDITIONABLE, ORACLE_MAINTAINED)

values ('SYS', 'I_COBJ#', null, 30, 30, 'INDEX', to_date('07-07-2014 05:39:01', 'dd-mm-yyyy hh24:mi:ss'), to_date('07-07-2014 05:39:01', 'dd-mm-yyyy

hh24:mi:ss'), '2014-07-07:05:39:01', 'VALID', 'N', 'N', 'N', 4, null, 'NONE', null, 'Y');

end loop;

commit;

end;

PL/SQL procedure successfully completed.

SQL> exec dbms_stats.gather_table_stats('SYS','T2');

PL/SQL procedure successfully completed.

SQL> select table_name,num_rows,blocks,num_rows/blocks from dba_tables where table_name='T2' and owner='SYS';

TABLE_NAME NUM_ROWS    BLOCKS NUM_ROWS/BLOCKS

------------------------------ ---------- ---------- ---------------

T2    91413 1535  59.552443

我们看到Oracle并没有为这个表新分配数据块,还是使用原来的数据块的空闲空间.当某些块中原来的部分数据行被删除时,这一部分空间可以被重用,这也是为什么oracle的表不需要进行碎片整理的原因。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 关于JDBC连接Oracle数据库,是否必须有Oracle客户端
  • Linux系统查看Oracle服务是否启动
  • oracle for linux 是否免费?
  • Window客户端通过ADO是否能够连接和操作Unix平台下的Oracle数据库?
  • shell调用oracle储存过程,怎么判断储存过程执行结果是否正确
  • solaris9下怎么查看oracle服务是否启动,以及怎么启动,在线等待。
  • Oracle判断指定列是否全部为数字的sql语句
  • IT科技资讯 iis7站长之家
  • linux上安装oracle 数据库后,是否能写shell程序实现数据库的自动启动。
  • 查找oracle数据库表中是否存在系统关键字的方法
  • Oracle删除表前判断表名是否存在若存在则删除
  • SOS!java如何用jdbc与oracle相连,是否要安装相应的驱动程序
  • cpio文件是否一定要刻成光盘才能安装?(oracle9i安装)
  • oracle使用instr或like方法判断是否包含字符串
  • 紧急! 如何得知一特定表是否存在的信息?(ORACLE).....
  • 在Oracle的每行数据上,都有一个标志位来表示该行数据是否被锁定。标志位是什么?
  • REDHAT LINUX 企业版是否有盗版问题;ORACLE 一定要用LINUX企业版么?
  • 安装Oracle失败后是否一定要重装系统
  • Oracle中检查是否需要重构索引的sql
  • 查看Oracle中是否有锁表的sql
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3