powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подводные камни create drop для временного хранения данных
11 сообщений из 11, страница 1 из 1
Подводные камни create drop для временного хранения данных
    #39546987
chidoriami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем добра!

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

Задача:
Должна быть реализована универсальная процедура, работающая с любыми парами таблиц, если эти таблицы отвечают определенным требованиям.
назовем их таблица А и таблица В.
Структура у них одинаковая.
Таблица В может быть любого, даже самого гигантского размера.
Таблица А обычно не больше миллиона строк, но изредка может быть и 10 миллионов. В будущем системы запланирован рост числа данных.
В промежуточной таблице процедура сохраняет (на время сессии) rowid строк обеих таблиц, которые будут затронуты изменением.
В процедуре динамически формируется запрос, который формирует на основе данных обеих таблиц новые правильные строки для таблицы В. Часть из них пойдет как новые, а часть уже присутствует в В в неправильном виде. В том числе неправильным может считаться и одно из ключевых полей.

Т.о. можно удалить из таблицы B все связанные строки и вставить туда результат запроса.
Точнее, сначала вставить новые, т.к. в запросе используются данные B, а потом удалить старые уже не нужные.
Тут возникает препятствие в виде уникального индекса, который не дает вставить часть новых строк из-за пересечения по ключу.
И появляется два принципиальных варианта:
1. использовать merge по B.rowid, при котором для части строк (заранее неизвестно, для части какого/соотношения) будет апдейт с вероятным изменением одного из полей уникального ключа.
2. положить результат запроса в промежуточную структуру, удалить по rowid все связанные строки из В, вставить в В из промежуточной структуры.

Лично я склоняюсь к варианту 2.
но тут опять возникают варианты:
2.1. создать и в дальнейшем использовать некую таблицу С, повторяющую В, но хранящую только результат запроса. Может быть, temporary table. Возражение - Еще одна постоянная структура в базе, когда и так есть таблицы А, созданные специально для этой цели.
2.2. в процессе работы процедуры создавать таблицу С, а потом дропать ее за собой.
2.3. динамически создавать коллекцию, вставлять туда данные, потом извлекать через forall или table().

Эти три варианта выглядят несколько безумно =)
поэтому я начинаю склоняться к первоначальному варианту 1.
или 2.2., потому что он наиболее прост с точки зрения понимания работы (когда я открою эту процедуру через год и начну читать комментарии).

В общем, как вы считаете, что лучше выбрать? Насколько merge лучше или хуже, чем insert+delete+insert?
...
Рейтинг: 0 / 0
Подводные камни create drop для временного хранения данных
    #39547007
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. merge не позволит обновить ключ, по которому проводится соединение.
2. индекс можно сделать неуникальным, что позволит повесить deferrable primery key и обойти проблему с дублями в пределах одной транзакции.
3. можно merge-ить все изменения, не затрагивающие ключ, а операции с изменением PK прогонять отдельно простым update.
4. если есть возможность гарантировать отсутствие постороннего DML во время операции, то можно пройти путем
- create Z as select from b, a, c
- exchange partition with b including indexes without validation
- drop Z
5. На самом деле очень мало что мешает сначала удалять затронутые строки, а затем вставлять - все равно целевой набор готовите "сбоку" (вариация на тему 4).
...
Рейтинг: 0 / 0
Подводные камни create drop для временного хранения данных
    #39547376
chidoriami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у меня, видимо, не получилось нормально описать.
если будет merge, он будет соединять целевую таблицу и то, что в using, по rowid, поэтому проблемы с обновлением ключа как таковой нет, все выполнится.

с exchange partition хорошая идея, но она является развитием варианта "создать таблицу, использовать, дропнуть".
а я как раз и не могу понять, насколько эта идея плоха.
какие могут быть подводные камни в таком подходе?
кроме одновременного запуска по одной и той же паре таблиц (это решаемо)
...
Рейтинг: 0 / 0
Подводные камни create drop для временного хранения данных
    #39547491
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chidoriami"создать таблицу, использовать, дропнуть".
а я как раз и не могу понять, насколько эта идея плоха.
какие могут быть подводные камни в таком подходе?
Если много-много раз так делать, то может попухнуть словарь.
Но это тоже не проблема, если дроп заменить truncate-ом, а create - insert append-ом
...
Рейтинг: 0 / 0
Подводные камни create drop для временного хранения данных
    #39547494
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И да, хранить (persistence) rowid - в общем случае нездоровая идея.
Однажды между операциями подготовки промежуточных объектов и merge-ем случится какой-нибудь alter table move и при неудачном стечении звезд результат может оказаться... неожиданным.
...
Рейтинг: 0 / 0
Подводные камни create drop для временного хранения данных
    #39547506
chidoriami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я не храню rowid на постоянной основе
авторВ промежуточной таблице процедура сохраняет ( на время сессии ) rowid строк обеих таблиц

авторможет попухнуть словарь
мм.. это как? в смысле, в самой таблице словаря в блоках будет много пустого места от такого подхода? оракл что-нибудь делает сам со своими словарями в таком случае или за этим дба должны следить?
...
Рейтинг: 0 / 0
Подводные камни create drop для временного хранения данных
    #39547552
Фотография DВА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousИ да, хранить (persistence) rowid - в общем случае нездоровая идея.
Однажды между операциями подготовки промежуточных объектов и merge-ем случится какой-нибудь alter table move и при неудачном стечении звезд результат может оказаться... неожиданным.

по описанию подходов понятно одно - никто кроме автора с этими таблицами параллельно работать не будет )))
ну а если будет, то сам виноват
...
Рейтинг: 0 / 0
Подводные камни create drop для временного хранения данных
    #39547553
chidoriami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну это DWH =))
во время загрузки такого не делают по определению)))
...
Рейтинг: 0 / 0
Подводные камни create drop для временного хранения данных
    #39547555
chidoriami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в смысле, move'ов не делают. а одновременного наката изменений на таблицу тоже не будет, уже по ограничениям архитектуры
...
Рейтинг: 0 / 0
Подводные камни create drop для временного хранения данных
    #39547594
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DВАну а если будет, то сам виноват
Так "он" ТС-у подгадит, а не "сам виноват" :)
Причем ошибку могут обнаружить и совсем не сразу.

...помимо alter tble бывает еще rowmovement, тоже не следует забывать.
Впрочем, если целевую таблицу залочить перед операцией, набор готовить "сбоку" посредством insert select, а завершать транзакцию exchange partition - может получиться вменяемая конструляция.
А вот merge по rowid не одобряю, и все тут :)
...
Рейтинг: 0 / 0
Подводные камни create drop для временного хранения данных
    #39547602
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
andrey_anonymousА вот merge по rowid не одобряю, и все тут :)В DWH это нормально и позволяет уменьшить накладные расходы за счет отсутствия необходимости дергать индексы или удобно параллелить вручную, но только если объем изменений не слишком высок, иначе эффективнее будут вариации этого:
andrey_anonymous4. если есть возможность гарантировать отсутствие постороннего DML во время операции, то можно пройти путем
- create Z as select from b, a, c
- exchange partition with b including indexes without validation
- drop Z
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подводные камни create drop для временного хранения данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]