【问题标题】:limit query time in the client side of PostgreSQL限制 PostgreSQL 客户端的查询时间
【发布时间】:2020-02-18 15:02:10
【问题描述】:

我正在尝试查询PostgreSQL数据库,但这是一个公共服务器,我真的不想长时间浪费大量CPU。

所以我想知道是否有某种方法可以将我的查询时间限制为特定持续时间,例如 3/5/10 分钟。

我假设有像 limit 这样的语法,但不是针对结果数量,而是针对查询持续时间。

感谢您的任何帮助。

【问题讨论】:

  • 有statement_timeout。但是您可能会争辩说,运行查询 10 分钟只是为了得到一个错误并丢弃任何已经完成的工作,这更加浪费。您是否希望获得部分结果?或者预测查询需要多长时间,甚至拒绝开始执行?

标签: sql postgresql performance limit


【解决方案1】:

设置statement_timeout,如果超过该限制,您的查询将因错误而终止。

根据this 文档:

statement_timeout(整数)

中止任何需要超过 指定的毫秒数,从时间开始 命令从客户端到达服务器。如果 log_min_error_statement 设置为 ERROR 或更低,该语句 超时也会被记录。零值(默认值)转 关闭。

不建议在 postgresql.conf 中设置 statement_timeout 因为它会影响所有会话。

【讨论】:

    【解决方案2】:

    这是使用LIMIT 控制查询可能运行多长时间的潜在问题。正确地,您还应该在查询中使用ORDER BY,以告诉 Postgres 它应该如何限制结果集的大小。但这里需要注意的是,当使用 LIMITORDER BY 时,Postgres 通常必须具体化整个结果集,然后还可能进行排序,这可能比仅仅读取整个结果集需要更长的时间。

    对此的一种解决方法可能是只使用LIMIT 而不使用ORDER BY。如果执行计划不包括读取整个表和排序,那么它可能是做你想做的一种方法。但是,请记住,如果您走这条路,Postgres 将获得免费许可,可以按任何顺序从它希望的表中返回 any 记录。从业务或报告的角度来看,这可能不是您想要的。

    但是,这里更好的方法是使用诸如索引之类的东西来调整您的查询,并使其更快地达到您不需要诉诸LIMIT 技巧的程度。

    【讨论】:

    • 谢谢@Tim。我知道limit 的注意事项。我想要一种方法在一段时间后停止查询以避免服务器过载。
    • 而我的回答是甚至没有达到你需要这样做的地步。了解您的数据,了解您的查询,不要让这种情况发生。
    • 谢谢。我很欣赏你的态度。
    猜你喜欢
    • 2015-11-01
    • 2018-06-05
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 2018-11-30
    • 2014-01-17
    相关资源
    最近更新 更多