【问题标题】:How to return record count in PostgreSQL如何在 PostgreSQL 中返回记录数
【发布时间】:2011-08-25 06:54:47
【问题描述】:

我有一个带有限制和偏移量的查询。例如:

select * from tbl
limit 10 offset 100;

如何在不运行第二个查询的情况下跟踪记录数:

select count(*) from tbl;

我认为this 回答了我的问题,但我需要它用于 PostgreSQL。有什么想法吗?

【问题讨论】:

  • 我只需要一个查询,因为我的查询非常慢(大约 1 秒),并且由于性能问题我无法运行两次(我的查询在一个非常大桌子)。
  • 除非你指定ORDER BY子句,否则它也是没有意义的。
  • @Дамян Станчев:所以这是一个性能问题,你真的没有理由不能使用第二个计数查询吗?
  • 有 - 选择计数(*)我必须再次重新获取全文搜索结果以及其他限制,并且查询很慢......

标签: sql postgresql


【解决方案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)
      

      获取行数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-14
        • 2012-06-08
        • 1970-01-01
        • 2012-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-22
        相关资源
        最近更新 更多