ResultBufferSize
默认情况下,Vertica 使用 ResultBufferSize 参数来确定客户端可从服务器检索的结果集的最大大小(以字节为单位)。如果启用了 ResultBufferSize,则 Vertica 会直接将数据行发送到发出查询的客户端。每次数据提取返回到客户端的行数取决于 ResultBufferSize 参数的大小(以字节为单位)。
有时,客户端请求的结果集大小会大于 ResultBufferSize 参数所允许的大小。在这种情况下,Vertica 一次只会检索结果集的一部分。每次数据提取将返回等于 ResultBufferSize 参数所设置的大小的数据量。最后,随着客户端循环访问各次数据提取,将返回整个结果集。
ResultBufferSize 的优点
如果您担心查询对网络延迟造成的影响,ResultBufferSize 可提供比 MARS 更有利的优势。MARS 要求客户端等待直至所有数据行都已写入到服务器,然后才能检索数据。由于需要等待存储结果,此延迟可能会造成网络延迟问题。
此外,MARS 要求发送两个单独的请求以返回数据行。第一个请求完成查询执行,此步骤会将结果集存储在服务器上。第二个请求检索存储在服务器上的数据行。使用 ResultBufferSize 时,您只需要发送一个请求。此请求会执行并检索相关数据行。
使用 ResultBufferSize 的查询执行
下图显示了已启用 ResultBufferSize 时 Vertica 如何将数据库中的数据行返回到客户端:
查询执行将完成以下步骤:
-
客户端将查询(例如 SELECT 语句)发送到服务器。在上图中,第一个查询名为查询 1。
-
服务器接收客户端的请求,并开始将结果集的描述和请求的数据行发送回客户端。
-
所有可能的行均已返回到客户端之后,执行便已完成。返回的数据集的大小等于已请求的数据的大小,或者等于 ResultBufferSize 参数可检索的最大数据量。如果尚未达到 ResultBufferSize 最大大小,则 Vertica 可以执行查询 2。
服务器可以接受查询 2,并执行与查询 1 相同的步骤。如果查询 1 的结果已达到 ResultBufferSize 可允许的最大大小,则在客户端释放查询 1 的结果之前,Vertica 无法执行查询 2。
查询 2 运行之后,您无法查看为查询 1 检索的结果,除非再次执行查询 1。
设置无限的缓冲区大小
将 ResultBufferSize 设置为 0 会告知客户端驱动程序使用无限的结果集缓冲区。使用此设置,客户端库将分配尽可能多的内存来读取查询的整个结果集。您可以选择将 ResultBufferSize 设置为 0,以模拟通过单个数据库连接同时进行多个活动查询。由于缓冲区大小不受限制,您的客户端可以运行查询并将其整个结果集存储在内存中。这将结束第一个查询,因此您的客户端可以在完全处理第一个查询的结果之前执行第二个查询。
此方法的一个缺点是,如果您的查询返回较大的结果集,您的查询可能会消耗过多的内存。这种内存过度分配可能会导致操作系统终止您的客户端。由于存在这种风险,请考虑使用多个数据库连接,而不是尝试针对多个查询重用单个连接。与处理大型数据集所需的资源总量相比,多个数据库连接的开销很小。