这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

管理客户端和 Vertica 之间的查询执行

以下主题介绍了可帮助您管理客户端和 Vertica 数据库之间的查询执行的技术。

1 - ResultBufferSize

默认情况下,Vertica 使用 ResultBufferSize 参数来确定客户端可从服务器检索的结果集的最大大小(以字节为单位)。如果启用了 ResultBufferSize,则 Vertica 会直接将数据行发送到发出查询的客户端。每次数据提取返回到客户端的行数取决于 ResultBufferSize 参数的大小(以字节为单位)。

有时,客户端请求的结果集大小会大于 ResultBufferSize 参数所允许的大小。在这种情况下,Vertica 一次只会检索结果集的一部分。每次数据提取将返回等于 ResultBufferSize 参数所设置的大小的数据量。最后,随着客户端循环访问各次数据提取,将返回整个结果集。

ResultBufferSize 的优点

如果您担心查询对网络延迟造成的影响,ResultBufferSize 可提供比 MARS 更有利的优势。MARS 要求客户端等待直至所有数据行都已写入到服务器,然后才能检索数据。由于需要等待存储结果,此延迟可能会造成网络延迟问题。

此外,MARS 要求发送两个单独的请求以返回数据行。第一个请求完成查询执行,此步骤会将结果集存储在服务器上。第二个请求检索存储在服务器上的数据行。使用 ResultBufferSize 时,您只需要发送一个请求。此请求会执行并检索相关数据行。

使用 ResultBufferSize 的查询执行

下图显示了已启用 ResultBufferSize 时 Vertica 如何将数据库中的数据行返回到客户端:

查询执行将完成以下步骤:

  1. 客户端将查询(例如 SELECT 语句)发送到服务器。在上图中,第一个查询名为查询 1。

  2. 服务器接收客户端的请求,并开始将结果集的描述和请求的数据行发送回客户端。

  3. 所有可能的行均已返回到客户端之后,执行便已完成。返回的数据集的大小等于已请求的数据的大小,或者等于 ResultBufferSize 参数可检索的最大数据量。如果尚未达到 ResultBufferSize 最大大小,则 Vertica 可以执行查询 2。

服务器可以接受查询 2,并执行与查询 1 相同的步骤。如果查询 1 的结果已达到 ResultBufferSize 可允许的最大大小,则在客户端释放查询 1 的结果之前,Vertica 无法执行查询 2。

查询 2 运行之后,您无法查看为查询 1 检索的结果,除非再次执行查询 1。

设置无限的缓冲区大小

将 ResultBufferSize 设置为 0 会告知客户端驱动程序使用无限的结果集缓冲区。使用此设置,客户端库将分配尽可能多的内存来读取查询的整个结果集。您可以选择将 ResultBufferSize 设置为 0,以模拟通过单个数据库连接同时进行多个活动查询。由于缓冲区大小不受限制,您的客户端可以运行查询并将其整个结果集存储在内存中。这将结束第一个查询,因此您的客户端可以在完全处理第一个查询的结果之前执行第二个查询。

此方法的一个缺点是,如果您的查询返回较大的结果集,您的查询可能会消耗过多的内存。这种内存过度分配可能会导致操作系统终止您的客户端。由于存在这种风险,请考虑使用多个数据库连接,而不是尝试针对多个查询重用单个连接。与处理大型数据集所需的资源总量相比,多个数据库连接的开销很小。

2 - 多重活动结果集 (MARS)

只有在使用 JDBC 客户端连接与 Vertica 连接时才能启用 MARS。MARS 允许在单个连接中执行多个查询。ResultBufferSize 将查询的结果直接发送到客户端,而 MARS 先将结果存储在服务器上。完成查询和存储所有结果之后,您可向服务器发送检索请求以将行返回到客户端。

MARS 在会话级别进行设置,并且必须为每个新的会话启用。如果启用了 MARS,则会禁用 ResultBufferSize。不会返回任何错误,但会忽略 ResultBufferSize 参数。

MARS 的优点

与 ResultBufferSize 相比,MARS 允许同时存储来自不同查询的多个结果集。您还可以在前一个结果集的所有结果都已返回到客户端之前发送新的查询。这样可使应用程序能够将查询执行与结果检索分析,以便您可以在单个连接上同时处理不同的结果。

当启用 ResultBufferSize 时,您必须等待直至所有结果集都已返回到客户端,然后才能发送新的查询。

MARS 的另一个优点是,它释放资源的速度比 ResultBufferSize 更快。当查询正在运行时,资源由该查询会话占有。如果启用了 ResultBufferSize,性能低下的客户端可能会读取结果集的单个行,然后必须停下来以检索下一行。这样会导致查询无法快速完成,从而导致无法释放已用资源以用于其他应用程序。使用 MARS 时,客户端的速度与行的读取无关。结果写入到 MARS 存储后,将立即释放资源,而且客户端检索行的速度不再会成为问题。

使用 MARS 的查询执行

下图演示了已启用 MARS 时如何处理发送到服务器的多个查询:

查询 1:

  1. 查询 1 已发送到服务器。

  2. 查询 1 的行描述及其结果集状态已返回给客户端。但是,此时没有将结果返回给客户端。

  3. 查询 1 将完成,并且其结果会保存在服务器上。

    1. 现在,您可以发送命令以检索查询 1 的结果集的行。这些行存储在服务器上。已检索的行会和结果集的状态一起发送到客户端。通过跟踪结果集的状态,Vertica 能够跟踪已从服务器检索了哪些行。
  4. 查询 1 已成功完成,并且其结果集正存储在服务器上,现在可以执行查询 2 了。

查询 2:

  1. 查询 2 已发送到服务器。

  2. 查询 2 的行描述及其结果集状态已返回给客户端。但是,此时没有将结果返回给客户端。

  3. 查询 2 将完成,并且其结果会存储在服务器上。现在,查询 1 和查询 2 的结果集都已存储在服务器上。

  4. 现在,您可以将检索请求发送到查询 1 和查询 2 已存储在服务器上的结果集。每次对查询 1 中的行发出请求时,将发送请求,并且行和结果集状态会发送到客户端。查询 2 也会出现相同。

客户端已读取所有行后,服务器上的 MARS 存储会关闭活动的结果会话。然后会释放服务器上的 MARS 存储,以便存储更多数据。会话完成后,MARS 存储也会关闭并释放。

启用和禁用 MARS

可以通过以下两种不同方法启用和禁用 MARS:

  1. 要使用 JDBC 客户端连接属性启用 MARS,请参阅 JDBC 连接属性

  2. 要使用 SET SESSION 命令启用 MARS,请参阅 SET SESSION MULTIPLEACTIVERESULTSETS

另请参阅