【问题标题】:Efficient row reading with libpq (postgresql)使用 libpq (postgresql) 进行高效的行读取
【发布时间】:2021-11-01 13:03:50
【问题描述】:

这是一个与可扩展性相关的问题。

我们想从表中读取一些行,并在处理其中一些行后,停止查询。停止条件取决于数据(我们事先不知道我们对多少行或哪些行感兴趣)。

当表的行数远远超过我们真正感兴趣的行数时,这对可伸缩性很敏感。

如果我们使用标准的 PQExec,所有的行都会被返回并且我们被强制使用它们(我们必须调用 PQGetResult 直到它返回 null)。所以这不能扩展。

我们现在正在尝试“逐行”阅读。

我们首先使用了 PQsendQuery 和 PQsetSingleRowMode。但是,我们仍然需要调用 PQGetResult 直到它返回 null。

我们的最后一种方法是 PQsendQuery、PQsetSingleRowMode,当我们完成后,我们按如下方式取消查询

  void CloseRowByRow() {
    PGcancel *c = PQgetCancel(conn);
    char errbuf[256];
    PQcancel(c, errbuf, 256);
    PQfreeCancel(c);
    while (res) {
      PQclear(res);
      res = PQgetResult(conn);
    }
  }

这会产生一些性能优势,但我们想知道这是否是我们能做到的最好的。

那么问题来了:还有其他办法吗?

【问题讨论】:

    标签: postgresql scalability libpq


    【解决方案1】:

    使用DECLAREFETCH 定义和读取服务器端游标,这正是它们的用途。您将使用标准 API,FETCH 只会让您以受控大小的批次检索结果。详情请见the examples in the docs

    【讨论】:

    • 感谢您的快速回复。我们已经快速测试了您的建议,但在我们的测试用例中效率更低。与“取消查询”解决方案相比,额外的客户端-服务器往返似乎会造成性能损失。你觉得这有意义吗?
    猜你喜欢
    • 2010-12-13
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多