一个表T1有33万数据,大概是这个规律:
A     B
---  -----
1    'abc'
1    'de'
4    'fgh'
7    'up'
8    'rs'
8    'xy'
.    .
.    .
.    .我通过一个算法,要把这个表的数据转化到另一张表T2中,变成下面这个样子:
A   B
--- ------
1   'abcde'
4   'fgh'
7   'up'
8   'rsxy'
.   .
.   .
.   .做完并COMMIT后,T2只有6万多数据了,但我的表空间用的很厉害,3个500M的空间都用完了,
而且下次再做这样的操作时,创建表的速度越来越慢,表空间用的仍然很厉害。
不知道是什么原因????
在创建T2时我用了个函数,如下create or replace function f(
Column2Value in Varchar2,ColumnName1 in Varchar2,ColumnName2 in Varchar2,TableName  in Varchar2) 
  return varchar2 is
  v_Result varchar2(32767);
  type cur_type is ref cursor;
  myCur cur_type;
  v_Column1Value varchar2(4000);
begin
  Open myCur for 'Select '||ColumnName1||' From '||TableName||' Where '||ColumnName2||' = '||Column2Value;
  Loop
    Fetch myCur Into v_Column1Value;
    Exit When myCur%notfound;
    v_Result:=v_Result||v_Column1Value||',';
  End Loop;
  Close myCur;
  return(v_Result);
end f;创建T2的语句是:
CREATE TABLE T2 AS SELECT ID,f(B,'A','B','T1') from T1 group by B;创建出的T2只有6万多数据,那我的表空间为什么用的那么多?
这些空间能找回来吗????

解决方案 »

  1.   

    select  a.tablespace_name,
           round(a.bytes_alloc / 1024 / 1024, 2) megs_alloc,
           round(nvl(b.bytes_free, 0) / 1024 / 1024, 2) megs_free,
           round((a.bytes_alloc - nvl(b.bytes_free, 0)) / 1024 / 1024, 2) megs_used,
           round((nvl(b.bytes_free, 0) / a.bytes_alloc) * 100,2) Pct_Free,
           100 - round((nvl(b.bytes_free, 0) / a.bytes_alloc) * 100,2) Pct_used,
           round(maxbytes/1048576,2) Max
    from  ( 
            select  f.tablespace_name, sum(f.bytes) bytes_alloc,
                    sum(decode(f.autoextensible, 'YES',f.maxbytes,'NO', f.bytes)) maxbytes
            from dba_data_files f
            group by tablespace_name
    ) a,( 
            select  f.tablespace_name,
                   sum(f.bytes)  bytes_free
            from dba_free_space f
            group by tablespace_name
    ) b
    where a.tablespace_name = b.tablespace_name (+)
    用这个语句看看是否表空间真的使用了那么大?