Повторно ли HAWQ использует процессы QE после завершения запроса?

Процессы Query Executor создаются на сегментах для выполнения запросов. Когда я делаю запрос, я вижу рабочие QE. Но когда запрос завершен, они все еще находятся в состоянии ожидания. Повторно ли HAWQ использует процессы QE после завершения запроса?

5 ответов

Да, процесс HAWQ QE поддерживается на уровне сеанса. Если вы уже завершили запрос, но с сеансом жив, в следующем запросе, который вы отправили через тот же сеанс, будут повторно использоваться уже запущенные QE.

Есть два феномена: 1) Номер отслеживаемого процесса QE меньше, чем количество QE, необходимое для нового запроса на том же хосте. В этом случае HAWQ будет повторно использовать перехваченные QE, а также запускать новые QE для недостаточного количества. 2) Номер отслеживаемого процесса QE больше, чем количество QE, необходимое для нового запроса на том же хосте. В этом случае HAWQ выберет некоторые QE внутри этих отслеживаемых QE. Вы увидите, что некоторые КС все еще бездействуют.

Количество необходимых QE определяется менеджером ресурсов.

Moveover, если вы запустите команду "SET", если на хостах сегмента обнаружены перехваченные QE, все QE будут использованы повторно. Но если нет отслеживаемых QE, команда "SET" не запускает QE в сегменте.

Кэш QE в HAWQ предназначен для двух целей:

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

  2. Отладка в разработке функций и исправление ошибок.

QE текущего запроса освобождаются, если текущий сеанс закрыт или они простаивают после gp_vmem_idle_resource_timeout ms. Это 10 минут в отладочной сборке и 18 секунд в выпускной сборке по умолчанию. Вы можете обратиться к guc.c для деталей:

{
    {"gp_vmem_idle_resource_timeout", PGC_USERSET, CLIENT_CONN_OTHER,
        gettext_noop("Sets the time a session can be idle (in milliseconds) before we release gangs on the segment DBs to free resources."),
        gettext_noop("A value of 0 turns off the timeout."),
        GUC_UNIT_MS | GUC_GPDB_ADDOPT
    },
    &IdleSessionGangTimeout,

#ifdef USE_ASSERT_CHECKING
    600000, 0, INT_MAX, NULL, NULL /* 10 minutes by default on debug builds.*/
#else
    18000, 0, INT_MAX, NULL, NULL
#endif
}

Да. Если в интервале появляется другой запрос, QE могут быть использованы повторно. Если этот интервал истекает, QEs выходят.

Более того, выход из сеанса завершит работу всех разветвленных QE независимо от того, какой интервал будет.

Интервал GUC равен gp_vmem_idle_resource_timeout, вы можете установить его в своем сеансе.

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