Процессы исполнителя запросов создаются в сегментах для выполнения запросов. Когда я делаю запрос, я вижу работающие QE. Но когда запрос завершен, они все еще живы в состоянии простоя. Использует ли HAWQ повторно процессы QE после завершения запроса?
Использует ли HAWQ повторно процессы QE после завершения запроса?
Ответы (5)
Да, процесс HAWQ QE сохраняется на уровне сеанса. Если вы уже завершили запрос, но сеанс активен, следующий запрос, отправленный через тот же сеанс, будет повторно использовать уже запущенные QE.
Возможны два явления: 1) Количество перехваченных процессов QE меньше, чем QE, необходимых для нового запроса на том же хосте. В этом случае HAWQ повторно использует перехваченные QE, а также запускает новые QE для недостаточного количества. 2) Количество перехваченных процессов QE превышает количество QE, необходимых для нового запроса на том же хосте. В этом случае HAWQ выберет несколько QE внутри этих перехваченных QE. Вы увидите, что некоторые QE все еще простаивают.
Количество необходимых QE определяется менеджером ресурсов.
Кроме того, если вы запустите команду «SET», если на хостах сегмента есть перехваченные QE, все QE будут повторно использованы. Но если перехваченных QE нет, команда «SET» не будет запускать QE в сегменте.
Кэш QE в HAWQ предназначен для двух целей:
Повторно используйте QE между последовательными запросами, чтобы избежать их разветвления каждый раз, когда мы запускаем запрос, и, таким образом, повысить производительность запросов, особенно для небольших запросов.
Отладка в разработке функций и исправление ошибок.
QE текущего запроса освобождаются, если текущий сеанс закрыт или они простаивают после gp_vmem_idle_resource_timeout мс. По умолчанию это 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 можно использовать повторно. Если этот интервал истечет, QE завершатся.
Кроме того, выход из сеанса приведет к завершению всех разветвленных QE независимо от интервала.
Интервал GUC равен gp_vmem_idle_resource_timeout, вы можете установить его в своей сессии.