一个表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万多数据,那我的表空间为什么用的那么多?
这些空间能找回来吗????
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万多数据,那我的表空间为什么用的那么多?
这些空间能找回来吗????
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 (+)
用这个语句看看是否表空间真的使用了那么大?