123
返回列表 发新帖
楼主: matrix

怎样回收表空间的空间?

[复制链接]
论坛徽章:
0
21#
发表于 2005-3-14 15:23 | 只看该作者
在自动段空间管理的方式的表空间下建立的表,将会忽略表的PCT_USED参数

使用道具 举报

回复
论坛徽章:
131
2006年度最佳技术回答
日期:2007-01-24 12:58:48福特
日期:2013-10-24 13:57:422014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:142013年新春福章
日期:2013-02-25 14:51:24
22#
发表于 2005-3-14 15:37 | 只看该作者
你delete和insert的是同一张table马?

使用道具 举报

回复
论坛徽章:
41
ITPUB元老
日期:2007-04-18 10:10:372012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23迷宫蛋
日期:2012-05-09 13:09:18双黄蛋
日期:2013-01-21 12:55:59马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
23#
发表于 2005-3-14 15:53 | 只看该作者
请教一下husthxd,那delete后的空间实际上是回收了,可以往里写新的数据吧?

使用道具 举报

回复
论坛徽章:
0
24#
 楼主| 发表于 2005-3-14 16:37 | 只看该作者
husthxd 斑竹做的例子可能不能说明问题!
(我说的不知道对不对,见谅)因为你插入的数据不够多,没有使数据库的使用率达到pctfree所限定的值,也就是说数据块还在freelist列表当中,且你每次删除数据都是整个表删除(表空间test只有一个表),这样从freelist中踢出的数据块也又会重新加入到freelist中,所有的数据块都是可用的。不会影响空间的使用。

我的情况是表空间test已经被我使用到报ORA-1653错误了,我的大部分的数据块可能都处于不可用状态(没在freelist中),而且我删除数据是有条件的,也就是说没有全部把表清空。可能清空后的比例还在pctused(40)之上。所以我即使删除了数据,也还是无法插入的,因为数据块是不可用的(没在freelist中)。

不知道我说的对不对??

使用道具 举报

回复
论坛徽章:
0
25#
发表于 2005-3-14 16:45 | 只看该作者
auto segment space management 不需要freelist来管理block,而是通过segment header的bitmap来管理的

使用道具 举报

回复
论坛徽章:
0
26#
 楼主| 发表于 2005-3-14 17:05 | 只看该作者
最初由 kele08 发布
[B]auto segment space management 不需要freelist来管理block,而是通过segment header的bitmap来管理的 [/B]


使用segment header的bitmap来管理又是什么样的机制呢?

我的表空间TBS_DOC有5G,包括4张表,在几天的大数据量插入的时候,报错ora-1653。查看表空间使用率已达到99%。
于是我就
delete tab1 where Oper_date<sysdate -10;
delete tab2 where Oper_date<sysdate -10;
delete tab3 where Oper_date<sysdate -10;
delete tab4 where Oper_date<sysdate -10;
commit;
删除了至少70%的数据,但是表空间的使用率还是99%。但是可以插入数据,又过了3天,又报了一次ora-1653,于是我又执行上述删除语句,还是删除了大约70%的数据,commit后表空间的使用率还是99%,这是再运行程序插入,就插不进去了,一直报ora-1653错误。
我exp/imp重新导入后,表空间的使用率变成20%了,也可以正常插入数据了。那我每次都要exp/imp吗???还是auto管理的机制我没有正确的使用。

使用道具 举报

回复
论坛徽章:
168
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-01-04 11:49:54蜘蛛蛋
日期:2011-12-05 16:08:56ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41设计板块每日发贴之星
日期:2011-07-22 01:01:02ITPUB官方微博粉丝徽章
日期:2011-06-30 12:30:16管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:33
27#
发表于 2005-3-14 19:55 | 只看该作者
最初由 matrix 发布
[B]husthxd 斑竹做的例子可能不能说明问题!
(我说的不知道对不对,见谅)因为你插入的数据不够多,没有使数据库的使用率达到pctfree所限定的值,
不是数据库的使用率,而是数据库块的使用率.以数据库块为单位
也就是说数据块还在freelist列表当中,且你每次删除数据都是整个表删除(表空间test只有一个表),这样从freelist中踢出的数据块也又会重新加入到freelist中,所有的数据块都是可用的。不会影响空间的使用。

我的情况是表空间test已经被我使用到报ORA-1653错误了,我的大部分的数据块可能都处于不可用状态(没在freelist中),而且我删除数据是有条件的,也就是说没有全部把表清空。可能清空后的比例还在pctused(40)之上。所以我即使删除了数据,也还是无法插入的,因为数据块是不可用的(没在freelist中)。

不知道我说的对不对?? [/B]


你的例子pctused为40,据文档所述,删除数据后已用数据库的空间小于40%的时候数据块才会重新进入freelist.
如下的实验pctused设置为1


SQL> alter table t_1 pctused 1
  2  /

表已更改。

SQL>
SQL> truncate table t_1
  2  /

表已截掉。

SQL> select segment_name,bytes/1024/1024,blocks from dba_segments
where segment_name = 'T_1'
  2  /

SEGMENT_NAME
--------------------------------------------------------------------------------

BYTES/1024/1024     BLOCKS
--------------- ----------
T_1
       .0390625          5


SQL> select tablespace_name,sum(bytes)/1024/1024,sum(blocks) from
dba_free_space
  2  where tablespace_name = 'TEST' group by tablespace_name
  3  /

TABLESPACE_NAME                SUM(BYTES)/1024/1024 SUM(BLOCKS)
------------------------------ -------------------- -----------
TEST                                       9.953125        1274

SQL> select count(*) from t_1
  2  /

  COUNT(*)
----------
         0

SQL> insert into t_1 select * from dba_objects
  2  /

已创建24777行。

SQL> insert into t_1 select * from dba_objects
  2  /

已创建24777行。

SQL> insert into t_1 select * from dba_objects where rownum < 200
00
  2  /

已创建19999行。

SQL> commit
  2  /

提交完成。

SQL> select count(*) from t_1
  2  /

  COUNT(*)
----------
     69553

SQL>
SQL>
SQL>
SQL> select segment_name,bytes/1024/1024,blocks from dba_segments
where segment_name = 'T_1'
  2  /

SEGMENT_NAME
--------------------------------------------------------------------------------

BYTES/1024/1024     BLOCKS
--------------- ----------
T_1
      7.4609375        955


SQL> select tablespace_name,sum(bytes)/1024/1024,sum(blocks) from
dba_free_space
  2  where tablespace_name = 'TEST' group by tablespace_name
  3  /

TABLESPACE_NAME                SUM(BYTES)/1024/1024 SUM(BLOCKS)
------------------------------ -------------------- -----------
TEST                                        2.53125         324

SQL> insert into t_1 select * from dba_objects where rownum < 500

  2  /
insert into t_1 select * from dba_objects where rownum < 500
            *
ERROR 位于第 1 行:
ORA-01653: 表TEST.T_1无法通过473(在表空间TEST中)扩展

SQL>
SQL> delete t_1 where rownum < 10000
  2  /

已删除9999行。

SQL> commit;

提交完成。

SQL>


SQL> insert into t_1 select * from dba_objects where rownum < 980
0
  2  /

已创建9799行。

SQL> insert into t_1 select * from dba_objects where rownum < 100

  2  /

已创建99行。

SQL> /

已创建99行。

SQL> /
insert into t_1 select * from dba_objects where rownum < 100
*
ERROR 位于第 1 行:
ORA-01653: 表TEST.T_1无法通过473(在表空间TEST中)扩展


SQL> commit;

提交完成。

SQL> select count(*) from t_1
  2  /

  COUNT(*)
----------
     69551

SQL>

根据条件删除后数据仍然可以插入.

你的情况还没有遇到过.可能的话把你的实验过程贴出来看看?

使用道具 举报

回复
论坛徽章:
168
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-01-04 11:49:54蜘蛛蛋
日期:2011-12-05 16:08:56ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41设计板块每日发贴之星
日期:2011-07-22 01:01:02ITPUB官方微博粉丝徽章
日期:2011-06-30 12:30:16管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:33
28#
发表于 2005-3-14 20:01 | 只看该作者
最初由 WESTLIFE_XU 发布
[B]请教一下husthxd,那delete后的空间实际上是回收了,可以往里写新的数据吧? [/B]


Yeah.

使用道具 举报

回复
论坛徽章:
3
每日论坛发贴之星
日期:2005-06-07 01:01:13授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
29#
发表于 2005-3-14 20:16 | 只看该作者
delete后做alter table table_name move tablespace tablespace_name;
但是表上的索引和约束会无效,rebuild索引,重建约束就行了

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表