多重活动结果集 (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 的行描述及其结果集状态已返回给客户端。但是,此时没有将结果返回给客户端。
-
查询 1 将完成,并且其结果会保存在服务器上。
- 现在,您可以发送命令以检索查询 1 的结果集的行。这些行存储在服务器上。已检索的行会和结果集的状态一起发送到客户端。通过跟踪结果集的状态,Vertica 能够跟踪已从服务器检索了哪些行。
-
查询 1 已成功完成,并且其结果集正存储在服务器上,现在可以执行查询 2 了。
查询 2:
-
查询 2 已发送到服务器。
-
查询 2 的行描述及其结果集状态已返回给客户端。但是,此时没有将结果返回给客户端。
-
查询 2 将完成,并且其结果会存储在服务器上。现在,查询 1 和查询 2 的结果集都已存储在服务器上。
-
现在,您可以将检索请求发送到查询 1 和查询 2 已存储在服务器上的结果集。每次对查询 1 中的行发出请求时,将发送请求,并且行和结果集状态会发送到客户端。查询 2 也会出现相同。
客户端已读取所有行后,服务器上的 MARS 存储会关闭活动的结果会话。然后会释放服务器上的 MARS 存储,以便存储更多数据。会话完成后,MARS 存储也会关闭并释放。
启用和禁用 MARS
可以通过以下两种不同方法启用和禁用 MARS:
-
要使用 JDBC 客户端连接属性启用 MARS,请参阅 JDBC 连接属性。
-
要使用 SET SESSION 命令启用 MARS,请参阅 SET SESSION MULTIPLEACTIVERESULTSETS。