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之上。