Oracle не может повторно использовать удаленные блоки - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь вставить данные от PURCHASE_HIST_D до PURCHASE_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 ГБ используемых блоков, которые можно повторно использовать для новых данных.

Я запросил то же самое для исходной таблицы:

-- 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'; 

Исходный файл занимает всего 27 ГБ, так что, похоже, мне не нужно добавлять больше места для табличного пространства.

Это информация о свободном табличном пространстве:

-- 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';

Так почему, когда я выполняю вставку (даже с подсказкой NOAPPEND), я получаю сообщение об ошибке, что в tablesapce недостаточно места?

-- 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

1 Ответ

0 голосов
/ 22 октября 2019

Вы получаете свободное место (используя запрос) из таблицы, но верхний водяной знак все еще находится в той точке, откуда вы не можете вставить данные ниже этого.

Вам необходимо освободить это пространство, используя следующую:

alter table your_table enable row movement;

alter table your_table shrink space cascade;

Кроме того, после такой операции вам необходимо будет перестроить индексы таблицы.

См. Документация Oracle для получения информации об утилизации ненужного пространства.

Ура !!

...