Я пытаюсь преобразовать постоянные таблицы, используемые в хранимой процедуре, в глобальные временные таблицы. Я просмотрел статистику по этим постоянным таблицам, и некоторые из них содержат десятки миллионов строк данных и имеют размер в гигабайтах (до 10 ГБ).
So,
CREATE TABLE my_table (
column1 NUMBER,
column2 NUMBER,
etc...
)
TABLESPACE BIGTABLESPACE
NOLOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
MONITORING;
должен стать
CREATE GLOBAL TEMPORARY TABLE my_table (
column1 NUMBER,
column2 NUMBER,
etc..
)
ON COMMIT PRESERVE ROWS;
Я создаю эквивалентную глобальную временную таблицу со строками, которые должны сохраняться до конца сеанса для каждой существующей постоянной таблицы. Эта глобальная временная таблица будет использоваться в процедуре вместо постоянной таблицы.
(EXECUTE IMMEDIATE 'TRUNCATE ...'
в начале и INSERT /*+ APPEND */ INTO
позже)
Все постоянные таблицы были созданы в большом табличном пространстве BIGTABLESPACE
В документации Oracle указано, что глобальная временная таблица будет создана во временном табличном пространстве пользователя (я предполагаю, что это TEMP
). Проблема заключается в том, что табличное пространство TEMP невелико, и экстенты не настроены на рост до размера, который мне нужен, чтобы они увеличивались во время процедуры.
Табличное пространство TEMP
было создано при создании базы данных
create database "$oracle\_sid"
user sys identified by "$sys\_password"
user system identified by "$system\_password"
set default bigfile tablespace
controlfile reuse
maxdatafiles 256
maxinstances $maxinstances
maxlogfiles 16
maxlogmembers 3
maxloghistory 1600
noarchivelog
character set WE8MSWIN1252
national character set AL16UTF16
datafile
'$oracle\_home/oradata/$oracle\_sid/system01.dbf' size 512M
logfile
'$oracle\_home/oradata/$oracle\_sid/redo01.log' size 1G,
'$oracle\_home/oradata/$oracle\_sid/redo02.log' size 1G,
'$oracle\_home/oradata/$oracle\_sid/redo03.log' size 1G
sysaux datafile
'$oracle\_home/oradata/$oracle\_sid/sysaux01.dbf' size 256M
default temporary tablespace temp tempfile
'$oracle\_home/oradata/$oracle\_sid/temp01.dbf' size 5G
undo tablespace "UNDOTBS1" datafile
'$oracle\_home/oradata/$oracle\_sid/undotbs01.dbf' size 5G;
Постоянные таблицы (которые я планирую заменить) изначально были созданы в табличном пространстве BIGTABLESPACE
-- 50G bigfile datafile size
create bigfile tablespace "BIGTABLESPACE"
datafile '$oracle\_home/oradata/$oracle\_sid/bts01.dbf' size 50G
extent management local
segment space management auto;
Индексы постоянных таблиц были изначально созданы в табличном пространстве BIGTABLESPACE
.
-- 20G bigfile datafile size
create bigfile tablespace "BIGINDXSPACE"
datafile '$oracle\_home/oradata/$oracle\_sid/btsindx01.dbf' size 20G
extent management local
segment space management auto;
- Возможна ли замена этих постоянных таблиц глобальными временными таблицами?
- Табличное пространство TEMP столкнется с проблемой расширения табличного пространства TEMP. Есть ли способ создать глобальные временные таблицы и их индексы в табличных пространствах
BIGTABLESPACE
иBIGINDXSPACE
? - Если нет, как я могу заставить табличное пространство
TEMP
вести себя как табличное пространство большого файла и добиться разделения индексов и таблиц? - Могу ли я создать два
TEMP
табличных пространства больших файлов и создать индексы в одном, а таблицы в другом?
Я хочу использовать глобальные временные таблицы, но объем данных, которые я обрабатываю в этой процедуре, кажется, выходит за рамки дизайна глобальных временных таблиц с отступами. Какие-либо предложения?