【发布时间】: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