阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

184次阅读
没有评论

共计 2247 个字符,预计需要花费 6 分钟才能阅读完成。

近日有 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 的表不需要进行碎片整理的原因。

更多 Oracle 相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-05/130994.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计2247字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中