This media is not supported in your browser
VIEW IN TELEGRAM
PDML на таблице с триггером. Ответ
Друзья, всем привет! 👋
С вами Костя Андронов.
В понедельник мы задали вопрос: как ускорить вставку данных в таблицу с триггером?
❓ Почему Oracle отключает PDML на таблице с триггером?
Триггер может делать что угодно:
🔹 обновлять другие таблицы,
🔹 вызывать процедуры,
🔹 бросать исключения и т.д.
А при параллельном выполнении это создаёт риски:
🔸 сложно обеспечить транзакционную целостность,
🔸 легко попасть в коллизии,
🔸 поведение становится непредсказуемым.
Поэтому Oracle просто отключает параллелизм на уровне SQL — чтобы не рисковать.
Но это не означает, что мы не можем выполнять вставку параллельно вовсе. Просто управлять этим процессом теперь должен не оптимизатор, а мы сами — со стороны приложения.
🧩 Как вручную распараллелить вставку?
Один из удобных способов — использовать пакет DBMS_PARALLEL_EXECUTE.
Он позволяет легко распараллелить выполнение задачи через фоновые джобы. Что нужно сделать:
1️⃣ Создать задачу:
2️⃣ Разбить данные на чанки соответствующим методом:
🔹по ROWID,
🔹по колонке с типом NUMBER,
🔹или произвольным запросом с двумя колонками start_id и end_id (оба типа NUMBER).
3️⃣ Запустить выполнение:
Oracle сам создаст нужное число джобов, и будет передавать в каждый start_id и end_id через bind-переменные. Количество одновременно работающих джобов настраивается параметром при запуске.
📌 Таким образом, мы контролируем параллелизм вручную, и даже наличие триггера не мешает нам ускорить вставку.
🎥 Как это выглядит вживую — видео к посту.
💬 Обсудить решение или предложить свой способ можно в нашем Чатике
📋 А чтобы глубже погрузиться в оптимизацию — открыта предзапись на 7 поток
С вами был Костя Андронов. Всем отличного дня и приятного просмотра! 🚀
#oracle #оптимизация #sql #Konstantin_Andronov
Канал Oracle Developer | Чатик 💬
Мини-курс Оптимизация: Быстрый старт 🚀
Анкета предзаписи на 7 поток "Оптимизация Oracle SQL"
Друзья, всем привет! 👋
С вами Костя Андронов.
В понедельник мы задали вопрос: как ускорить вставку данных в таблицу с триггером?
❓ Почему Oracle отключает PDML на таблице с триггером?
Триггер может делать что угодно:
🔹 обновлять другие таблицы,
🔹 вызывать процедуры,
🔹 бросать исключения и т.д.
А при параллельном выполнении это создаёт риски:
🔸 сложно обеспечить транзакционную целостность,
🔸 легко попасть в коллизии,
🔸 поведение становится непредсказуемым.
Поэтому Oracle просто отключает параллелизм на уровне SQL — чтобы не рисковать.
Но это не означает, что мы не можем выполнять вставку параллельно вовсе. Просто управлять этим процессом теперь должен не оптимизатор, а мы сами — со стороны приложения.
🧩 Как вручную распараллелить вставку?
Один из удобных способов — использовать пакет DBMS_PARALLEL_EXECUTE.
Он позволяет легко распараллелить выполнение задачи через фоновые джобы. Что нужно сделать:
1️⃣ Создать задачу:
dbms_parallel_execute.create_task(...)
2️⃣ Разбить данные на чанки соответствующим методом:
🔹по ROWID,
🔹по колонке с типом NUMBER,
🔹или произвольным запросом с двумя колонками start_id и end_id (оба типа NUMBER).
3️⃣ Запустить выполнение:
Oracle сам создаст нужное число джобов, и будет передавать в каждый start_id и end_id через bind-переменные. Количество одновременно работающих джобов настраивается параметром при запуске.
📌 Таким образом, мы контролируем параллелизм вручную, и даже наличие триггера не мешает нам ускорить вставку.
🎥 Как это выглядит вживую — видео к посту.
💬 Обсудить решение или предложить свой способ можно в нашем Чатике
📋 А чтобы глубже погрузиться в оптимизацию — открыта предзапись на 7 поток
С вами был Костя Андронов. Всем отличного дня и приятного просмотра! 🚀
#oracle #оптимизация #sql #Konstantin_Andronov
Канал Oracle Developer | Чатик 💬
Мини-курс Оптимизация: Быстрый старт 🚀
Анкета предзаписи на 7 поток "Оптимизация Oracle SQL"
👍14❤3🔥2