如何在 PostgreSQL 中返回记录数
Posted
技术标签:
【中文标题】如何在 PostgreSQL 中返回记录数【英文标题】:How to return record count in PostgreSQL 【发布时间】:2011-08-25 06:54:47 【问题描述】:我有一个带有限制和偏移量的查询。例如:
select * from tbl
limit 10 offset 100;
如何在不运行第二个查询的情况下跟踪记录数:
select count(*) from tbl;
我认为this 回答了我的问题,但我需要它用于 PostgreSQL。有什么想法吗?
【问题讨论】:
我只需要一个查询,因为我的查询非常慢(大约 1 秒),并且由于性能问题我无法运行两次(我的查询在一个非常大桌子)。 除非你指定ORDER BY
子句,否则它也是没有意义的。
@Дамян Станчев:所以这是一个性能问题,你真的没有理由不能使用第二个计数查询吗?
有 - 选择计数(*)我必须再次重新获取全文搜索结果以及其他限制,并且查询很慢......
【参考方案1】:
我找到了一个解决方案,我想分享它。我所做的是 - 我从应用了过滤器的真实表中创建一个临时表,然后我从临时表中选择一个限制和偏移量(没有限制,所以性能很好),然后从临时表(同样没有过滤器),然后是我需要和最后的其他东西 - 我删除了临时表。
select * into tmp_tbl from tbl where [limitations];
select * from tmp_tbl offset 10 limit 10;
select count(*) from tmp_tbl;
select other_stuff from tmp_tbl;
drop table tmp_tbl;
【讨论】:
【参考方案2】:我没有尝试过,但是从documentation 中标题为Obtaining the Result Status
的部分中,您可以使用GET DIAGNOSTICS
命令来确定命令的效果。
GET DIAGNOSTICS number_of_rows = ROW_COUNT;
来自文档:
此命令允许检索系统状态指示器。每个物品 是一个关键字,用于标识要分配给 指定的变量(它应该是正确的数据类型来接收 它)。当前可用的状态项为 ROW_COUNT, 由发送到 SQL 引擎的最后一个 SQL 命令处理的行, 和 RESULT_OID,最新插入的最后一行的 OID SQL 命令。请注意,RESULT_OID 仅在 INSERT 之后才有用 命令到包含 OID 的表中。
【讨论】:
【参考方案3】:取决于您是从 psql CLI 需要它,还是从 HTTP 服务器之类的东西访问数据库。我正在使用 Node 服务器中的 postgres 和 node-postgres。结果集在结果对象上作为一个名为“rows”的数组返回,所以我可以这样做
console.log(results.rows.length)
获取行数。
【讨论】:
以上是关于如何在 PostgreSQL 中返回记录数的主要内容,如果未能解决你的问题,请参考以下文章
获取 PostgreSQL 中受 INSERT 或 UPDATE 影响的记录数