powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / DBMS_PARALLEL_EXECUTE
5 сообщений из 5, страница 1 из 1
DBMS_PARALLEL_EXECUTE
    #39379508
FireX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Столкнулся с проблемой. Есть задача, которая обрабатывается в параллели в 10 потоков. Например на начало выполнения разбивается задача на 200 чанков, создаются 10 потоков, которые берут в обработку чанк, после завершения одного, переходят к следующему. И тут начинается самое интересное, в большинстве случаев все работает как описал. Но бывает, когда создались 10 потоков, но в итоге 9 потоков отвалились по окончании обработки чанка и к новому не перешли, и все сводиться в 1 поток, бывает в 2. В alert.log нет никаких упоминаний об аварийной завершении джоба в это время. Уже и пакет пересмотрел, но все упирается во внешние методы на С.
...
Рейтинг: 0 / 0
DBMS_PARALLEL_EXECUTE
    #39379527
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
DBMS_PARALLEL_EXECUTE
    #39379536
FireX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Элик спасибо.
Действительно проблема в определении следующего свободного чанка. Ребята не учли, что один и тот же чанк может быть взять разными потоками в одно и то же время. Т.е. если 2 потока освободились одновременно, то один возьмет новый чанк, а второй получит ошибку блокировки и скорее всего на верху стоит глушилка. В новых версиях они использовали
Код: plsql
1.
SELECT FOR UPDATE SKIP LOCKED

и переписали сам метод dbms_parallel_execute_internal.GET_RANGE под новую логику.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 Старый код UPDATE DBMS_PARALLEL_EXECUTE_CHUNKS$
      SET STATUS   = DBMS_PARALLEL_EXECUTE.ASSIGNED,
          START_TS = SYSTIMESTAMP,
          END_TS   = NULL,
          JOB_NAME = P_JOB_NAME
      WHERE STATUS      = DBMS_PARALLEL_EXECUTE.UNASSIGNED
        AND TASK_OWNER# = OWNER#
        AND TASK_NAME   = L_TASK_NAME
        AND ROWNUM < 2
      RETURNING CHUNK_ID, START_ROWID, END_ROWID, START_ID, END_ID
      INTO      CHUNK_ID, START_ROWID, END_ROWID, START_ID, END_ID;
...
Рейтинг: 0 / 0
DBMS_PARALLEL_EXECUTE
    #39379539
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FireXДействительноТы понял, что версию указывать немаловажно?
...
Рейтинг: 0 / 0
DBMS_PARALLEL_EXECUTE
    #39379543
FireX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicFireXДействительноТы понял, что версию указывать немаловажно?
Да, согласен на все 100. Но у меня это воспроизводилось не у одного заказчика и на разных версиях, но у всех стояла меньше 11.2.0.4. Но теперь зная где ошибка, можно разврапить пакет dbms_parallel_execute_internal и посмотреть на метод GET_RANGE
Еще раз спасибо.
И еще, я поторопился с выводом об ошибке блокировки, 2-й поток просто бы получил пустой чанк CHUNK_ID и посчитал, что свободных чанков больше нет и завершил свою работу. И так со всеми чанками, я обратил внимание, что у меня чанки отваливались по одному, не сразу все сваливались, а продолжали работу какое-то время.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / DBMS_PARALLEL_EXECUTE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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