0

查询执行器进程在段上创建以执行查询。当我进行查询时,我可以看到有效的 QE。但是当查询完成时,它们仍然处于空闲状态。HAWQ 是否在查询完成后重用 QE 进程?

4

5 回答 5

2

是的,HAWQ QE 流程保持在会话级别。如果您已经完成了一个查询但会话处于活动状态,那么您通过同一会话发送的下一个查询将重用已经启动的 QE。

有两种现象:1)捕获的QE进程数小于同一主机上新查询所需的QE。在这种情况下,HAWQ 将重用捕获的 QE,并为数量不足的数量启动新的 QE。2) 捕获的 QE 进程号大于同一主机上新查询所需的 QE。在这种情况下,HAWQ 会在这些被捕获的 QE 中选择一些 QE。你会看到一些量化宽松政策仍然闲置。

所需的 QE 数量由资源管理器决定。

此外,如果你运行“SET”命令,如果在段主机上有捕获的 QE,所有的 QE 将被重用。但是如果没有捕获到 QE,“SET”命令将不会在段中启动任何 QE。

于 2016-07-10T07:06:06.260 回答
1

HAWQ 中的 QE 缓存有两个目的:

  1. 在连续查询之间重用 QE,以避免每次运行查询时都分叉它们,从而提高查询性能,特别是对于小型查询。

  2. 调试功能开发和错误修复。

如果当前会话关闭或在 gp_vmem_idle_resource_timeout 毫秒后空闲,则释放当前查询的 QE。默认情况下,调试构建为 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
}
于 2016-07-08T13:40:17.363 回答
0

此外,无论时间间隔如何,会话退出都会退出所有分叉的 QE。

于 2016-07-07T08:52:50.363 回答
0

是的。如果在一个区间内,有另一个查询,QE 可以被重用。如果此间隔超时,QE 将退出。

于 2016-07-07T08:46:01.110 回答
0

GUC 的间隔是 gp_vmem_idle_resource_timeout,你可以在你的会话中设置它。

于 2016-07-07T22:23:49.273 回答