Oracle不重用已删除的块
我正在尝试将数据从Oracle不重用已删除的块,oracle,insert,storage,dblink,tablespace,Oracle,Insert,Storage,Dblink,Tablespace,我正在尝试将数据从PURCHASE\u HIST\u D插入到PURCHASE\u HIST (不同服务器中的不同模式,使用DBLINK) 目标表有许多已删除的数据块 这是我检查分段与使用的块的方式: -- result : 199.8743480481207370758056640625 GB select (AVG_ROW_LEN*NUM_ROWS)/1024/1024/1024 from DBA_TABLES where TABLE_NAME='PURCHASE_HIST'; -- r
PURCHASE\u HIST\u D
插入到PURCHASE\u HIST
(不同服务器中的不同模式,使用DBLINK)
目标表有许多已删除的数据块
这是我检查分段与使用的块的方式:
-- result : 199.8743480481207370758056640625 GB
select (AVG_ROW_LEN*NUM_ROWS)/1024/1024/1024 from DBA_TABLES where TABLE_NAME='PURCHASE_HIST';
-- result: 250.7939453125 GB
select SUM(BYTES)/1024/1024/1024 from DBA_SEGMENTS where SEGMENT_NAME='PURCHASE_HIST';
这意味着有50 GB的已用数据块可以重新用于新数据
我将对源表执行相同的查询:
-- result: 21.8079682849347591400146484375
select (AVG_ROW_LEN*NUM_ROWS)/1024/1024/1024 from DBA_TABLES where TABLE_NAME='PURCHASE_HIST_D';
-- result: 27.447265625
select SUM(BYTES)/1024/1024/1024 from DBA_SEGMENTS where SEGMENT_NAME='PURCHASE_HIST_D';
源代码只有27GB,所以看起来我不需要为表空间添加更多空间
这是免费的表空间信息:
-- result: 1889477 (Used MB) 4923 (Free MB) 1894400 (Total MB)
select
fs.tablespace_name "Tablespace",
(df.totalspace - fs.freespace) "Used MB",
fs.freespace "Free MB",
df.totalspace "Total MB",
round(100 * (fs.freespace / df.totalspace)) "Pct. Free"
from
(select
tablespace_name,
round(sum(bytes) / 1048576) TotalSpace
from
dba_data_files
group by
tablespace_name
) df,
(select
tablespace_name,
round(sum(bytes) / 1048576) FreeSpace
from
dba_free_space
group by
tablespace_name
) fs
WHERE
DF.TABLESPACE_NAME = FS.TABLESPACE_NAME
and df.TABLESPACE_NAME = 'TS_DWHDATA';
那么,为什么在执行insert(即使没有出现提示)时,我会得到一个错误,即表apce中没有足够的空间
-- examole of the Insert
INSERT
/*+ monitor NOAPPEND parallel(64) statement_queuing */
INTO DWH.PURCHASE_HIST
SELECT *
FROM DWH_MIG.PURCHASE_HIST_D@DWH_MIG ;
例外情况:
ORA-01653: unable to extend table DWH.PURCHASE_HIST by 8192 in tablespace TS_DWHDATA
您将从表中获得可用空间(使用查询),但高水位线仍处于无法在其下方插入数据的位置 您需要使用以下方法回收该空间:
alter table your_table enable row movement;
alter table your_table shrink space cascade;
此外,在执行此类操作后,还需要重建表的索引
请参阅回收废物空间
干杯 但是当我们使用noappend时,其目的是数据库将搜索已删除的块并在其中插入新行。。。。如果我们需要缩小表-append和noappend之间有什么区别?Oracle的哪个版本?我相信如果您使用并行查询,许多/大多数线程都会插入到高水位线以上,这样多个线程就不会相互竞争。但这可能是版本相关的行为。你有关于它的参考资料吗?这里有一个参考资料,如果你做一个串行插入,我希望它使用高水位线以下的块。这来自你发送的文章:“正如你从上面的测试用例输出中看到的,直接路径(串行或并行)加载不会重复使用现有块中的任何可用空间。它总是“追加”“高于当前的高水位线,使细分市场增长“。它是关于串行和并行加载的,因为追加。但是,如果我没有出现提示,我认为空闲块将在高水位线下使用。直接路径插入可以做几件事,其中之一就是在高水位线上方插入。NOAPPEND应该强制它执行常规路径插入(取决于您拥有的11g的特定版本和您的配置),这样您就可以得到完整的重做生成,但我相信在某些情况下,常规路径并行加载将写入HWM之上。