Управление параллельной степенью выполнения sql

У меня есть процесс, который отправляет много команд для параллельного выполнения.

пример команды:

Insert /*+ parallel(16) */ ...

Проблема в том, что если запрошенная параллель выше, чем доступные серверы, команда понижается в степени параллельности, и поскольку я отправляю несколько команд вместе, они «крадут» параллельные серверы друг у друга.

У меня есть один конкретный запрос, который более важен и должен выполняться с запрошенной параллелью, в то время как другие запросы менее важны.

Есть ли способ заставить оптимизатор уменьшить степень параллельности других операторов и увеличить параллельность важного запроса?

Есть ли способ изменить параллельную степень оператора после его запуска?

Я использую оракул 11g.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
216
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Да, вы можете использовать диспетчер ресурсов.

В документах 11gr2 даже есть пример сценария, который в основном соответствует вашему переулку ... некоторые задания важнее других, как ограничить параллельные процессы, чтобы высвободить ресурсы для важных.

https://docs.oracle.com/cd/E11882_01/server.112/e25494/dbrm.htm#ADMIN13471

Oracle-Base, конечно, также поддерживает эту функцию. -- который, как вы видите, существует уже давно.

Обратите внимание, что для использования этой функции вам понадобится лицензионная копия Oracle Database Enterprise Edition... но если вы для начала используете столько ЦП, я полагаю, он у вас уже есть?

что Джеффсмит спасибо. это очень интересная особенность. Я этого не знал. В моем случае все утверждения исходят от одного и того же источника и пользователя, и я думаю, что это слишком сложно построить с помощью этого решения. Есть ли способ повлиять на параллелизм непосредственно в запросе?

user2671057 28.05.2019 15:15

да, создайте нового пользователя для важного или не важного запроса, запустите его от имени ЭТОГО пользователя и создайте правильно определенную ГРУППУ ПОТРЕБИТЕЛЯ РЕСУРСОВ, которая соответствующим образом регулирует DOP. Или вы пытались позволить оптимизатору решать, какой DOP необходим, а не кодировать его с помощью HINTS?

thatjeffsmith 28.05.2019 15:27
Ответ принят как подходящий

Изучите очередь операторов и такие параметры, как PARALLEL_MAX_SERVERS, чтобы убедиться, что важные процессы получают достаточное количество параллельных серверов. (По моему опыту, настройка диспетчера ресурсов слишком сложна и редко выполняется хорошо.)

Очередь операторов

Невозможно переместить параллельные серверы с одного оператора на другой во время их работы. Однако с помощью очереди операторов мы можем попросить Oracle не запускать важный оператор, пока у него не будет необходимых параллельных ресурсов. Для большого параллельного процесса может быть лучше подождать минуту и ​​получить все запрошенные параллельные серверы, чем сразу запускаться только с частичными ресурсами.

Используйте подсказку /*+ parallel(16) statement_queuing*/ в самых важных утверждениях.

Убедитесь, что параметр PARALLEL_SERVERS_TARGET установлен правильно — очередь операторов будет использовать только параллельные серверы до этого числа. Вы можете установить этот параметр таким же, как PARALLEL_MAX_SERVERS.

PARALLEL_MAX_SERVERS

Убедитесь, что параметр PARALLEL_MAX_SEERVERS установлен правильно. Это значение трудно установить, и я часто вижу низкие значения. Имейте в виду, что параллельные серверы Oracle являются относительно легкими процессами. В большинстве случаев половина выделенных серверов будет использоваться только для хранения промежуточных результатов и не будет работать.

Например, если ваша система имеет 32 ядра, вы должны установить для параметра PARALLEL_MAX_SERVERS значение по меньшей мере 64, а не 128 или 256. Многие администраторы баз данных неправильно уменьшают значение параметра PARALLEL_MAX_SERVERS перед тестированием. Основываясь на моем опыте и тестах, серверы Oracle могут эффективно работать с большим количеством параллельных серверов, чем думает большинство людей.

Это то, что я искал. Решение просто отличное. Просто и хорошо работает. Спасибо.

user2671057 30.05.2019 15:40

Другие вопросы по теме