问题是这样的:我们建立了一个ORACLE数据库,三个表数据空间,对应三个索引表空间,也应时说表数据与索引数据是分开存放的不同的表空间的。问题是:
现在在其中一个表空间中,有一个表,在最近几天内所占空间突然无故疯狂增大。4月14号,那个表有202万多条数据,占空间0.7G左右,4月14号以后,每当这个表增加10万多条数据,其所占表空间增加将近1G!!请问,出现这种情况,是什么原因造成的?????有高手请指教!! 谢谢!!

解决方案 »

  1.   

    你的表里都保存什么了,有没有blob字段?
      

  2.   

    没有BLOB字段。有的话10多万条的数据新增,也不可能一下子空间增大1G多吧
      

  3.   

    表的结构如下:
    create table DW.F_PURCHASESTAT_DETAILS
    (
      OCCUR_DATE        VARCHAR2(8),
      ARRIVAL_DATE      VARCHAR2(8),
      ORDER_NO          VARCHAR2(20),
      LINE_NO           VARCHAR2(20),
      RELEASE_NO        VARCHAR2(20),
      RECEIPT_NO        VARCHAR2(20),
      INVOICE_NO        VARCHAR2(20),
      CSITECODE         VARCHAR2(20),
      CINVITEMCODE      VARCHAR2(25),
      CSUPPLIERCODE     VARCHAR2(20),
      CASSORTMENTCODE   VARCHAR2(20),
      CMANUFACTURERCODE VARCHAR2(20),
      QTY_ARRIVED       NUMBER,
      QTY_INVOICED      NUMBER,
      QTY_ESTIMATED     NUMBER,
      AMT_ARRIVED       NUMBER,
      AMT_INVOICED      NUMBER,
      AMT_ESTIMATED     NUMBER
    )
    tablespace DW_DATA
      pctfree 10
      initrans 1
      maxtrans 255
      storage
      (
        initial 64K
        minextents 1
        maxextents unlimited
      );
    -- Create/Recreate indexes 
    create index DW.F_PURSTAT_RECEIPT_OCCURDATE on DW.F_PURCHASESTAT_DETAILS (OCCUR_DATE)
      tablespace DW_INDX
      pctfree 10
      initrans 2
      maxtrans 255
      storage
      (
        initial 64K
        minextents 1
        maxextents unlimited
      );
    create index DW.INX_F_PURSTAT_DS_CASSORTCODE on DW.F_PURCHASESTAT_DETAILS (CASSORTMENTCODE)
      tablespace DW_INDX
      pctfree 10
      initrans 2
      maxtrans 255
      storage
      (
        initial 64K
        minextents 1
        maxextents unlimited
      );
    create index DW.INX_F_PURSTAT_DS_CINVITEMCODE on DW.F_PURCHASESTAT_DETAILS (CINVITEMCODE)
      tablespace DW_INDX
      pctfree 10
      initrans 2
      maxtrans 255
      storage
      (
        initial 64K
        minextents 1
        maxextents unlimited
      );
    create index DW.INX_F_PURSTAT_DS_CMANUCODE on DW.F_PURCHASESTAT_DETAILS (CMANUFACTURERCODE)
      tablespace DW_INDX
      pctfree 10
      initrans 2
      maxtrans 255
      storage
      (
        initial 64K
        minextents 1
        maxextents unlimited
      );
    create index DW.INX_F_PURSTAT_DS_CSITECODE on DW.F_PURCHASESTAT_DETAILS (CSITECODE)
      tablespace DW_INDX
      pctfree 10
      initrans 2
      maxtrans 255
      storage
      (
        initial 64K
        minextents 1
        maxextents unlimited
      );没有定长字段,也没有大字段。
      

  4.   

    回:worldly_wind(尘世的风) 这个表的插入数据时,执行是指数据查询结果插入。但是查询是存在于临时表空间的,查询的结果才插入这个表。这样的话,查询的好与坏会对插叙的目标表有这样的空间上的影响吗??
      

  5.   

    procedure P_LOAD_F_PURCHASESTAT_DS_MONTH(p_month varchar2)
      as
        v_ETL_TASK_ID INTEGER;
        v_SUCCEED_FLAG CHAR(1);
        v_ETL_ALL_FLAG CHAR(1);
        v_TableOwner VARCHAR2(30);
        v_FactTableName VARCHAR2(30);
        v_TableName VARCHAR2(30);
        v_TmpDate VARCHAR2(8);
        v_MinDate VARCHAR2(8);
        v_MaxDate VARCHAR2(8);
        v_TerminalDate VARCHAR2(8);
        v_Qty_Arrived NUMBER;
        v_Qty_Invoiced NUMBER;
        v_Counter INTEGER;
            
        cursor cur is
          select /*+NO_MERGE(r) NO_MERGE(i) NO_MERGE(t)*/ distinct
            to_char(min(t.invoice_date),'yyyymm') invoiced_date,                         
            to_char(r.arrival_date,'yyyymm') arrival_date,
            r.order_no order_no,                             
            r.line_no line_no,                              
            r.release_no release_no,
            r.receipt_no receipt_no,
            --t.invoice_no invoice_no,
            i.contract contract,
            i.part_no part_no,
            bi.pkg_purchasestat_api.Get_Vendor_No(r.order_no) vendor_no,
            bi.pkg_purchasestat_api.Get_Assortment(i.contract,i.part_no,bi.pkg_purchasestat_api.Get_Vendor_No(r.order_no)) assortmentcode,
            bi.pkg_purchasestat_api.Get_Manufacturer_ID(r.order_no,r.line_no,r.release_no) manufacturecode
          from 
            ods.purchase_receipt_tab r,
            ods.purchase_order_invoice_tab i,
            ods.invoice_tab t
          where r.order_no = i.order_no(+)
            and r.line_no = i.line_no(+)
            and r.release_no = i.release_no(+)
            and r.receipt_no = i.receipt_no(+)
            and i.ap_invoice_no = t.invoice_no(+)
            and t.rowstate <> 'Cancelled'
            and r.rowstate <> 'Cancelled'
            and (i.part_no like '1%' or i.part_no like '2%')
            and r.arrival_date is not null
            --and t.party_type='SUPPLIER'
            --and r.order_no = '300461'
          group by 
            to_char(r.arrival_date,'yyyymm'),
            r.order_no,                             
            r.line_no,                              
            r.release_no,
            r.receipt_no,
            --t.invoice_no,
            i.contract,
            i.part_no,
            bi.pkg_purchasestat_api.Get_Vendor_No(r.order_no),
            bi.pkg_purchasestat_api.Get_Assortment(i.contract,i.part_no,bi.pkg_purchasestat_api.Get_Vendor_No(r.order_no)),
            bi.pkg_purchasestat_api.Get_Manufacturer_ID(r.order_no,r.line_no,r.release_no);
            
        cursor cur_noinvoice is
          select
            to_char(prs.order_date,'yyyymm') order_date,
            to_char(prs.real_arrival_date,'yyyymm') arrival_date,
            prs.order_no,
            prs.line_no,
            prs.release_no,
            prs.receipt_no,
            prs.contract,
            prs.part_no,
            prs.vendor_no,
            bi.pkg_purchasestat_api.Get_Assortment(prs.contract,prs.part_no,prs.vendor_no) assortmentcode,
            bi.pkg_purchasestat_api.Get_Manufacturer_ID(prs.order_no,prs.line_no,prs.release_no) manufacturecode
          from ods.purchase_receipt_statistics prs
          where not exists (
            select 1 from ods.purchase_order_invoice_tab poit
            where poit.order_no = prs.order_no
              and poit.line_no = prs.line_no
              and poit.release_no = prs.release_no
              and poit.receipt_no = prs.receipt_no
          );
      begin
            BI.DISABLETABLEALLINDEX('DW.F_PURCHASESTAT_DETAILS');
            
            delete from DW.F_PURCHASESTAT_DETAILS
            where OCCUR_DATE = p_month;
            commit; 
            
      

  6.   

    有影响,以前我做过类似的insert into table1(...) select ... from table2 where ...;
    从多表关联往一个表里插入数据,因为where条件的问题,可能会让临时表空间急剧增长你可以优化再检查优化一下你的sql语句看看是不是这方面的原因
      

  7.   

    louie518老兄,如果你的办法能解决问题。我送你30分。
      

  8.   

    建立表空间的语句里写成storage(initial 8000k NEXT 20M MINEXTENTS 1  MAXEXTENTS unlimited  PCTINCREASE 0),你再多指定下next的增加值和PCTINCREASE值,把PCTINCREASE设置成0,再试试看,如果还不行,重建该表和其对应的表空间
      

  9.   

    如果对于更新较多的话,把pctfree设大点
      

  10.   

    在插入好个表的数据时使用了操作符:insert /*+append*/ into DW.F_PURCHASESTAT_DETAILS(.......)
    select /*+NO_MERGE(r) NO_MERGE(i) NO_MERGE(t)*/  
    .....
    ....
    from .....请问这有影响 吗?
      

  11.   

    另外,创建表空间的语句为:CREATE TABLESPACE "DW_DATA" 
        NOLOGGING 
        DATAFILE 'D:\oracle\oradata\alcan\DW_DATA.ORA' SIZE 1024M REUSE
        AUTOEXTEND 
        ON NEXT  512M MAXSIZE  32767M EXTENT MANAGEMENT LOCAL 
        SEGMENT SPACE MANAGEMENT  AUTO ; 
       
    COMMIT;   
        
    CREATE TABLESPACE "DW_INDX" 
        NOLOGGING 
        DATAFILE 'D:\oracle\oradata\alcan\DW_INDX.ORA' SIZE 1024M REUSE 
        AUTOEXTEND 
        ON NEXT  512M MAXSIZE  32767M EXTENT MANAGEMENT LOCAL 
        SEGMENT SPACE MANAGEMENT  AUTO ; 
       
    COMMIT;
      

  12.   

    有没有频繁的删除和插入啊,你exp出来,删除表后 然后在imp导入看看
      

  13.   

    作为临时表使用的表,在插入数据后,最好不提交,直接再查询,查询结束后回滚,这样就不会占用表空间;
    楼主是先插入提交再查询,然后删除提交,频繁的重复操作会占用大量的表空间的,建议更改程序或每隔一段时间TRUNCATE TABLE,否则会一直空间猛涨的