У меня есть процесс, который отправляет много команд для параллельного выполнения.
пример команды:
Insert /*+ parallel(16) */ ...
Проблема в том, что если запрошенная параллель выше, чем доступные серверы, команда понижается в степени параллельности, и поскольку я отправляю несколько команд вместе, они «крадут» параллельные серверы друг у друга.
У меня есть один конкретный запрос, который более важен и должен выполняться с запрошенной параллелью, в то время как другие запросы менее важны.
Есть ли способ заставить оптимизатор уменьшить степень параллельности других операторов и увеличить параллельность важного запроса?
Есть ли способ изменить параллельную степень оператора после его запуска?
Я использую оракул 11g.
Да, вы можете использовать диспетчер ресурсов.
В документах 11gr2 даже есть пример сценария, который в основном соответствует вашему переулку ... некоторые задания важнее других, как ограничить параллельные процессы, чтобы высвободить ресурсы для важных.
https://docs.oracle.com/cd/E11882_01/server.112/e25494/dbrm.htm#ADMIN13471
Oracle-Base, конечно, также поддерживает эту функцию. -- который, как вы видите, существует уже давно.
Обратите внимание, что для использования этой функции вам понадобится лицензионная копия Oracle Database Enterprise Edition... но если вы для начала используете столько ЦП, я полагаю, он у вас уже есть?
да, создайте нового пользователя для важного или не важного запроса, запустите его от имени ЭТОГО пользователя и создайте правильно определенную ГРУППУ ПОТРЕБИТЕЛЯ РЕСУРСОВ, которая соответствующим образом регулирует DOP. Или вы пытались позволить оптимизатору решать, какой DOP необходим, а не кодировать его с помощью HINTS?
Изучите очередь операторов и такие параметры, как PARALLEL_MAX_SERVERS
, чтобы убедиться, что важные процессы получают достаточное количество параллельных серверов. (По моему опыту, настройка диспетчера ресурсов слишком сложна и редко выполняется хорошо.)
Невозможно переместить параллельные серверы с одного оператора на другой во время их работы. Однако с помощью очереди операторов мы можем попросить Oracle не запускать важный оператор, пока у него не будет необходимых параллельных ресурсов. Для большого параллельного процесса может быть лучше подождать минуту и получить все запрошенные параллельные серверы, чем сразу запускаться только с частичными ресурсами.
Используйте подсказку /*+ parallel(16) statement_queuing*/
в самых важных утверждениях.
Убедитесь, что параметр PARALLEL_SERVERS_TARGET
установлен правильно — очередь операторов будет использовать только параллельные серверы до этого числа. Вы можете установить этот параметр таким же, как PARALLEL_MAX_SERVERS
.
Убедитесь, что параметр PARALLEL_MAX_SEERVERS
установлен правильно. Это значение трудно установить, и я часто вижу низкие значения. Имейте в виду, что параллельные серверы Oracle являются относительно легкими процессами. В большинстве случаев половина выделенных серверов будет использоваться только для хранения промежуточных результатов и не будет работать.
Например, если ваша система имеет 32 ядра, вы должны установить для параметра PARALLEL_MAX_SERVERS значение по меньшей мере 64, а не 128 или 256. Многие администраторы баз данных неправильно уменьшают значение параметра PARALLEL_MAX_SERVERS перед тестированием. Основываясь на моем опыте и тестах, серверы Oracle могут эффективно работать с большим количеством параллельных серверов, чем думает большинство людей.
Это то, что я искал. Решение просто отличное. Просто и хорошо работает. Спасибо.
что Джеффсмит спасибо. это очень интересная особенность. Я этого не знал. В моем случае все утверждения исходят от одного и того же источника и пользователя, и я думаю, что это слишком сложно построить с помощью этого решения. Есть ли способ повлиять на параллелизм непосредственно в запросе?