我有个数据库,里面有100+张表,其中有些表的数据相当大(超过百万条)!
现在当我把这个数据库的所有东西导入到另一台机器的数据库中,并把表里所有的字段都删除了后!
在执行DML语句时,速度明显比不上新建表DML操作的速度!这是为什么?怎样可以解决这个问题(在不需要创建类似表的情况下)!

解决方案 »

  1.   


    简单的方法是:
    exp出数据
    drop user;
    create user;
    imp 数据;
    复杂的方法是(10g):
    对每个表执行如下操作:
    alter table table_name enable row movement; 
    alter table table_name shrink space cascade;
      

  2.   

    转移表空间方法。alter table xxxx tablespace newts 
      

  3.   

      alter table table_name enable row movement; 
      alter table table_name shrink space cascade;
      各表示什么意思?可以达到我想要的效果吗?
      

  4.   

      这个只能一张表一张表的改吗?
      而且网上有说开启了row movement属性会使公共回退段的负荷增加!
      还有,谁能解释下 为什么会出现这中情况?
      

  5.   

    你的删除是delete 操作吗?你什么版本数据库?什么样的dml ?有没有子查询?表上有索引吗? 表空间是怎样管理的?对于你一个百万条数据的表,假设有10万个block,如果用delete 删除了所有的数据,但是表的大小不会变,仍然有10万个block,如果查询时,走的是全表扫表,oracle 依然要遍历这所有的10万个block,这个情况下,和你有没有删数据没有一点关系。你可以在导入时,只导入表结构,不要数据;或者将那些表truncate ,不要delete。
      

  6.   


    我用的是oracle90版本的!
    我也知道就是你所说的这种情况,是在执行DML操作时,就象是以前的数据没删除似的!
    什么是block?为什么会出现这种情况?我该怎么解决呢?
      

  7.   

    你说说的dml操作应该是insert吧
    1 这个时候你首先看你的数据库是否为归档模式,如果是,改为非归档;
    2 重建一个大回滚段,并将其他回滚段offline
    3 调大你的sga_max_size和bd_cach_size
    4 有没有索引和约束?有的话insert后再建立索引,约束也要在insert之后再enable
      

  8.   

    一切和执行计划有关.可以看到计划,就能解决问题.
    imp的除了基本的表格,还有很多其它数据.
      

  9.   

    就是7的解释了。
    其实就是因为LZ是用的delete表来清空,表的高水位并没有改变。要降低高水位,你用的是9I,就:alter table xxx move;
    执行后,你的DML会快很多。
      

  10.   

    你可以使用导入的方式进行数据移植。数据的删除使用truncate table 表明,删除的速度非常快。
      

  11.   

    删除数据后,表的统计信息没有更新,还是使用原来的执行计划。可以用 analyze 命令刷新一下表和索引的统计信息。
      

  12.   

    move相当于把表重建一次,可以move到另外的表空间,如果不指定表空间,则在原来的表空间中move,因此做move操作时,目标表空间需要保证有这个表同样大小的剩余空间,整个操作相当于exp/imp,并且在过程中可以修改表的不合理的存储参数,如pctfree、pctincrease、initial等,move表完后要重建索引。move之后一定要重建索引吧 alter index xxx rebuild; !那对应的该表的存储过程触发器等会不会受到影响?还有人说这样做副作用很大
    把  FSFI  参数变小了;或者说它把  user_free_space  里的block数变多了;
    会这样吗?怎么解决?