Управление параллельной степенью выполнения SQL - PullRequest
1 голос
/ 28 мая 2019

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

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

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

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

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

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

Есть ли способ изменить параллельную степень выражения после того, как он начал выполняться?

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

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Посмотрите на очереди операторов и параметры, такие как 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 могут эффективно обрабатывать больше параллельных серверов, чем думает большинство людей.

0 голосов
/ 28 мая 2019

Да, вы можете использовать Resource Manager.

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...