Переместить табличное пространство больших объектов на многораздельные таблицы
Рассмотрим следующие таблицы:
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, удаления таблицы, создания новой таблицы и восстановления данных, но я бы предпочел более чистое решение без необходимости дублирования больших объемов данных в разных таблицах.