易截截图软件、单文件、免安装、纯绿色、仅160KB

Oracle删除大表并回收空间的过程

近日在查询某项日志的时候,发现查询非常缓慢,根据以往的经验这是由于某个日志表过大引起的,为了加快查询,决定将大部分的历史数据迁移到另外一个表中,本文主要记录删除这个大表的过程,就解决问题而言还有很多方法,但是本文侧重点在于如何处理大数据量删除的操作,及其善后工作。
首先看看我们要做数据迁移的表所占的空间:
SQL> select segment_name , bytes/1048576 MB
 2 from user_segments
 3 order by bytes
 4 /
SEGMENT_NAME MB
-------------------------------------------------- ----------
TAB_NODE_PARAM .375
SYS_LOB0000053047C00004$$ .4375
PK_TAB_FLOW_HIS 1
PK_TAB_NODE_HIS 2
TAB_TASK_HIS 2
TAB_FLOW_HIS 4
TAB_NODE_HIS 17
PK_TAB_APPEXCHANGE_LOG 152
TAB_APPEXCHANGE_LOG 768看看历史数据大概所占的空间比例:
SQL> select count(*) from tab_appexchange_log
 2 where receive_time >= to_date('2009-01-01','yyyy-mm-dd')
 3 union all
 4 select count(*) from tab_appexchange_log
 5 where receive_time < to_date('2009-01-01','yyyy-mm-dd')
SQL> /
 COUNT(*)
----------
 1584298
 4037710从结果来看,的确存在很多历史数据,我们将 2009 年之前的数据迁移到别的表中。
SQL> create table tab_appexchange_log_20090101
 2 as
 3 select * from tab_appexchange_log
 4 where receive_time < to_date('2009-01-01','yyyy-mm-dd')
SQL> /
Table created.
SQL> select count(*) from tab_appexchange_log_20090101
 2 /
 COUNT(*)
----------
 4037710数据已经迁移一份到新的表里面了,可以删除原表中的旧数据了。
SQL> delete tab_appexchange_log where receive_time < to_date('2009-01-01','yyyy-mm-dd')
 2 /
delete tab_appexchange_log where receive_time < to_date('2009-01-01','yyyy-mm-dd')
 *
ERROR at line 1:
ORA-30036: unable to extend segment by 8 in undo tablespace 'UNDOTBS2'这里出现了一个 ORA-30036的错误,大概意思是undo表空间不足,看来是要删除的数据太多了,于是考虑化整为零,删一点,commit一下。
SQL> delete tab_appexchange_log where receive_time < to_date('2007-01-01','yyyy-mm-d


相关文档:

ORACLE数据库设计与优化


<!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;
mso-font-charset:2;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:0 268435456 0 0 -2147483648 0;}
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 ......

Oracle Decode函数的用法

DECODE函数是ORACLE PL/SQL是功能强大的函数之一,目前还只有ORACLE公司的SQL提供了此函数,其他数据库厂商的SQL实现还没有此功能。DECODE有什么用途呢? 先构造一个例子,假设我们想给智星职员加工资,其标准是:工资在8000元以下的将加20%;工资在8000元以上的加15%,通常的做法是,先选出记录中的工资字段值? select s ......

oracle 查询计划中基数问题

最近发现一个比较有意思的问题:
当我们在执行一条查询语句时,如果条件谓词中含有函数,如 abs(age)<10,此时,通过查询计划看到的结果集的基数值与实际的值相差很大。当我们改变查询条件时,如abs(age)<20,这时的基数值不会改变,和abs(age)<10得到的基数值一样。
但现在还没找到问题的原因,searching... ......

恢复oracle中用pl sql误删除drop掉的表


查看回收站中表
select object_name,original_name,partition_name,type,ts_name,createtime,droptime from recyclebin;
恢复表
SQL
>flashback table test_drop to before drop;或
SQL
>flashback table "BIN$b+XkkO1RS5K10uKo9BfmuA==$0" to befor ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号