MERGE используется для компактной реализации логики "нет строки - вставляем, есть - обновляем (удаляем)". В Warehousing с помощью такой команды можно добавлять инкремент в витрину. Но так ли уж полезен MERGE при больших объёмах данных?
MERGE можно использовать для обновления данных в колонках большой таблицы, выбирая данные из нескольких других не маленьких таблиц (или одной, как показано в примере ниже).
MERGE можно использовать для обновления данных в колонках большой таблицы, выбирая данные из нескольких других не маленьких таблиц (или одной, как показано в примере ниже).
Вот как можно это сделать:
Для соединения целевой таблицы и источника, в котором участвует целевая таблица для выборки данных, используем rowid этой же таблицы. Важно в блоке USING использовать псевдоним к rowid, иначе возникнет ошибка при выполнении MERGE. Эта ошибка не описывается в документации и не предлагается решения для её устранения. Экспериментальным путём было установлено, что надо использовать псевдоним.
При использовании MERGE для вставки данных, используя большие таблицы не обойтись без хинтов PARALLEL и APPEND, иначе будет медленно выполняться команда. Но при использовании этих хинтов, следует принять во внимание очень плохие последствия. При выполнении команды INSERT в таблицу будут добавляться новые экстенты и это будет приводить к увеличению размера таблицы не соразмерно объёму данных в ней.
Выполним следующий скрипт и соберём статистику, посмотрим сколько места занимает таблица.
Для хранения 100 строк таблице был выделен один экстент, в котором 8 блоков, каждый объёмом в 16 КБ .
Выполним следующий скрипт и соберём статистику, посмотрим сколько места занимает таблица.
Для хранения 100 строк таблице был выделен один экстент, в котором 8 блоков, каждый объёмом в 16 КБ .
Теперь выполним MERGE c хинтом APPEND, соберём статистику и проверим сколько места теперь стала занимать таблица:

В таблицу добавилась одна строка и был выделен еще один экстент. Теперь таблица стала занимать места в два раза больше: 2 экстента с 16 блоками.
Тот же результат будет получен, если использовать хинт PARALLEL с предварительно выполненной командой: alter session enable parallel dml;
Увеличение размера таблицы - актуальная проблема для Warehousing с партицированными таблицами.
Комментариев нет:
Отправить комментарий