Переместить табличное пространство больших объектов на многораздельные таблицы

Рассмотрим следующие таблицы:

CREATE TABLE TAB_ONE
(
  <irrelevant columns>
  MESSAGE CLOB,
  REC_DATE DATE,
  <irrelevant columns>
) TABLESPACE DATA_TS;

а также

CREATE TABLE TAB_TWO
(
  <irrelevant columns>
  RESPONSE CLOB,
  PART_ID NUMBER,
  <irrelevant columns>
  CONSTRAINT "FK_01"
    FOREIGN KEY ("PART_ID") REFERENCES  <IRRELEVANT_TABLE> ("SEQ_ID")
) TABLESPACE DATA_TS PARTITION BY REFERENCE (FK_01) ENABLE ROW MOVEMENT;

Теперь задача состоит в том, чтобы переместить все (C) большие объекты из DATA_TS во вновь выделенное табличное пространство с именем LOB_TS.

Для первой таблицы это достаточно просто:

ALTER TABLE TAB_ONE MOVE LOB ("MESSAGE") store as (tablespace LOB_TS compress low);

Для другого разделение делает всю проблему. Вышеупомянутая команда не работает по понятным причинам, поэтому мне удалось найти другую:

ALTER TABLE TAB_TWO MOVE PARTITION SYS_P18485 LOB (RESPONSE) STORE AS ( TABLESPACE LOB_TS COMPRESS LOW );
ALTER TABLE TAB_TWO MOVE PARTITION SYS_P18299 LOB (RESPONSE) STORE AS ( TABLESPACE LOB_TS COMPRESS LOW );

(по одному на каждый раздел таблицы TAB_TWO есть)

Эти ALTER TABLES сами по себе не выходят из строя. Разработчик SQL с гордостью заявляет: "Таблица TAB_TWO изменена".

Но потом я побежал SELECT * FROM USER_LOBS WHERE TABLE_NAME = 'TAB_TWO' и обнаружил, что CLOB остался в предыдущем табличном пространстве и не двигался.

Конечно, мне пришла в голову идея копирования данных с помощью Create Table as Select, удаления таблицы, создания новой таблицы и восстановления данных, но я бы предпочел более чистое решение без необходимости дублирования больших объемов данных в разных таблицах.

0 ответов

Другие вопросы по тегам