AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 306701
Accepted
Tom
Tom
Asked: 2022-01-28 12:00:27 +0800 CST2022-01-28 12:00:27 +0800 CST 2022-01-28 12:00:27 +0800 CST

PostgreSQL 中报表的查询性能

  • 772

我使用 PostgreSQL 12 来存储我的原始数据,并使用 ElasticSearch 作为报告的数据仓库。

碰巧在某些情况下JOIN(例如,数据存在于一个表中但不存在于另一个表中)ElasticSearch 不参与我,不得不直接在 PostgreSQL 中进行返回大量结果的查询。

许多年前,我使用SELECT <column1, column2> FROM <table> WHERE <conditions>;完全没有LIMITor OFFSET,这导致我的数据库负载很高,占用大量内存来返回结果,并且我的 Web 服务器无法处理返回的数据量,崩溃(内存例如限制溢出)。

为了解决这个问题,我开始使用分页系统,引入有限数量的记录,并使用 LIMIT 和条件对结果进行分页,以显示上一个查询的最后一条记录下方的记录。

例子:

-- 1st Query
SELECT <column1, column2> FROM <table> WHERE <conditions> LIMIT 512;
-- 2nd Query
SELECT <column1, column2> FROM <table> WHERE <conditions> AND id < last_id_query_1 LIMIT 512;
-- 3rd Query
SELECT <column1, column2> FROM <table> WHERE <conditions> AND id < last_id_query_2 LIMIT 512;

在我看来,这种方法似乎不是很好。阅读CURSORS它似乎做了类似的事情,但只使用一个搜索。一些网站表示它的性能比LIMIT/OFFSET.

这种说法是真的还是我现在的工作方式也不错?

由于我无法EXPLAIN ANALYZE在每个FETCH中执行CURSOR,我无法实际分析它是否更快并且具有更好的性能。

postgresql postgresql-performance
  • 1 1 个回答
  • 94 Views

1 个回答

  • Voted
  1. Best Answer
    jjanes
    2022-01-28T19:12:52+08:002022-01-28T19:12:52+08:00

    您当前正在做的是键集分页(除非您没有显示必要的 ORDER BY 以使其正常工作——我假设它确实存在)。对于许多查询和适当的索引,这可以很好地工作。你提到了一些关于它的担忧,但没有关于这些担忧的任何细节,很难知道它们的有效性和/或可解决性。

    当有大量页面时,光标和键集分页应该比 OFFSET/LIIMT 更有效,但请注意,在您的示例中没有 OFFSET。从哪里开始只有一个 LIMIT 和一个键集。换句话说,OFFSET/LIMIT 可能不好,但这不是你正在做的。

    键集分页优于服务器端游标分页的好处是状态完全由客户端有效地管理。如果客户端两周(或永远)没有返回下一页,则服务器不关心。但是,对于服务器端游标,您需要一些机制来保持在页面访问之间打开的数据库连接,并重新连接到它。您还需要一些机制来声明一个游标被放弃,以免它们积累并消耗无限量的资源。

    auto_explain 仍然会记录游标的计划,只要它通过显式 CLOSE 或通过 COMMIT 完全关闭。

    • 3

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve