我必须通过以下代码对 Postgres 执行 SQL 查询。该查询返回大量行(40M 或更多)并具有 4 个整数字段:当我使用 32Gb 的工作站时,一切正常,但在 16Gb 的工作站上,查询非常慢(我猜是由于交换)。有没有办法告诉 C++ 批量加载行,而无需等待整个数据集?由于可能更好的 JDBC 驱动程序,使用 Java 之前我从未遇到过这些问题。
try {
work W(*Conn);
result r = W.exec(sql[sqlLoad]);
W.commit();
for (int rownum = 0; rownum < r.size(); ++rownum) {
const result::tuple row = r[rownum];
vid1 = row[0].as<int>();
vid2 = row[1].as<int>();
vid3 = row[2].as<int>();
.....
} catch (const std::exception &e) {
std::cerr << e.what() << std::endl;
}
我正在使用 PostgreSQL 9.3,在那里我看到了这个http://www.postgresql.org/docs/9.3/static/libpq-single-row-mode.html,但我不知道如何在我的 C++ 代码上使用它。您的帮助将不胜感激。
编辑:这个查询只运行一次,用于创建必要的主内存数据结构。因此, tt 无法优化。此外,pgAdminIII 可以在同一台(或使用更小的 RAM)PC 上在一分钟内轻松获取这些行。此外,Java 可以轻松处理两倍的行数(使用 Statent.setFetchSize() http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#setFetchSize%28int%29)因此,这确实是 libpqxx 库的问题,而不是应用程序问题。有没有办法在 C++ 中强制执行此功能,而无需手动显式设置限制/偏移量?