具体情况是这样的,我的数据库是oracle9i。里面有张表数据量很大,大概是八千万条数据。这张表是按时间把一段时间内的数据放在一个表空间内。现在这张表大概用了十来个表空间。我现在要取一段时间内的数据,正好是其中一个表空间的。如果直接insert进另一张表,报回滚段错误。我想能不能指定只读这张表在那个专门存取那个时间段的表空间的数据,其它的表空间数据不管。这样就应该不会有问题了吧。或者其他的什么办法都可以?

解决方案 »

  1.   


    可能是分区吧。下面是这张表的建表语句的一部分:
    -- Create table
    create table SKSKJ.JS_SKSKJ_YHKRJYHZ
    (
      RJYHZ_ID VARCHAR2(34) not null,
      NSRSBH   VARCHAR2(20) not null,
      JSSJ     DATE not null,
      JSR      VARCHAR2(11) not null,
      JQBH     VARCHAR2(16) not null,
      RQ       DATE not null,
      DRZCFPS  NUMBER(6) not null,
      DRTPS    NUMBER(6) not null,
      DRFPS    NUMBER(6) not null,
      SWJG_DM  VARCHAR2(11) not null,
      DZQM     VARCHAR2(256) not null,
      JQJG     VARCHAR2(1)
    )
    partition by range (JSSJ)
    (
      partition P_201001 values less than (TO_DATE(' 2010-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
        tablespace LVSKSK_T_M_1001
        pctfree 10
        initrans 1
        maxtrans 255
        storage
        (
          initial 128K
          next 128K
          minextents 1
          maxextents unlimited
          pctincrease 0
        ),
      partition P_201002 values less than (TO_DATE(' 2010-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
        tablespace LVSKSK_T_M_1002
        pctfree 10
        initrans 1
        maxtrans 255
        storage
        (
          initial 128K
          next 128K
          minextents 1
          maxextents unlimited
          pctincrease 0
        ),
      partition P_201003 values less than (TO_DATE(' 2010-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
        tablespace LVSKSK_T_M_1003
        pctfree 10
        initrans 1
        maxtrans 255
        storage
        (
          initial 128K
          next 128K
          minextents 1
          maxextents unlimited
          pctincrease 0
        ),
      partition P_201004 values less than (TO_DATE(' 2010-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
        tablespace LVSKSK_T_M_1004
        pctfree 10
        initrans 1
        maxtrans 255
        storage
        (
          initial 128K
          next 128K
          minextents 1
          maxextents unlimited
          pctincrease 0
        ),
      

  2.   

    分区可以单独操作,在逻辑上对应用透明
    你可能insert时某个地方错了再检查一下
      

  3.   


    insert没错。原表和导入的表结构一样。 我只是想提取一个月的数据出来进行操作。应该是表数据量太大才报回滚段错误。你从我回复的表结构语句可以知道,这张表的数据是按月放在不同的tablespace里面。 
     tablespace LVSKSK_T_M_1001 放201001的;
     tablespace LVSKSK_T_M_1002 放201002的;
    ......
    就是这样存数据的。
     
      

  4.   

    接上面,这表是一个月数据放入一个tablespace。
       我现在是想把这张表其中某一个月的数据读出来放入另一张结构相同的表。假设我只要201002月的数据,那么我怎样写sql语句才能只select tablespace LVSKSK_T_M_1002 里面的数据而不是全表扫描?
       或者有其它方法解决表太大报回滚段错误?
       ps:我现在没管理员权限。
      

  5.   

    select * from SKSKJ.JS_SKSKJ_YHKRJYHZ partition(P_201002)