优化 Postgres 查询

Posted

技术标签:

【中文标题】优化 Postgres 查询【英文标题】:Optimize Postgres Query 【发布时间】:2013-09-27 03:52:16 【问题描述】:

我注意到我的代码中有以下查询,并想检查这是否可以优化。

UPDATE table as T1 SET C1=? 
  FROM 
    (SELECT C2, C3, C4 
        FROM table 
        WHERE C1=? and current_timestamp >= C5 
        ORDER BY C5 limit ? FOR UPDATE
    ) AS T2 
WHERE T1.C2 = T2.C2 AND T1.C3 = T2.C3 AND T1.C4 = T2.C4
RETURNING *;

C2、C3 上的索引

在 C5 上分区

表:

C1、C2、C3 - varchar C4、C5 - 时间戳

【问题讨论】:

不可能只用一个非常神秘的查询来回答。使用解释分析来找出 postgresql 花费时间的地方。如果您在解释分析的输出方面需要帮助,请将其插入您的问题中。 无法保证子查询为每个目标行准确返回一(或零)行。请先修复您的逻辑,然后再尝试优化您的性能。 (order by .. limit 1 是一种将子查询限制为一行的糟糕方法,如果这是您的意图) 【参考方案1】:

过早的优化是数据库中万恶之源。设计时要考虑到理智,然后在遇到问题时向我们展示。我不会回答这个问题,而是解释为什么无法回答。

SQL 是一种声明性语言,您可以在其中向数据库系统提供类似于数学公式的东西,它会计算出如何以最佳方式运行它。嗯,从技术上讲,查询一个数学公式,但数学反映了 SQL,而 SQL 近似于另一个数学领域,称为关系代数。

实际的优化过程很大程度上取决于读写模式,以及规划者知识的局限性。在您遇到实际瓶颈之前,没有办法评估一个查询相对于另一个查询的相对性能,除非您执行示例中不存在的某些事情(NOT EXISTS 往往很昂贵,而将其写成外连接和过滤内连接的情况,而不是作为反连接。大概这将在未来得到解决)。即使在这种情况下,也有很多情况下反连接不会产生太大影响,而且性能提升可能不值得担心。

因此,关键是您需要等到出现实际问题后再优化查询。然而,优化存储是非常不同的。

【讨论】:

以上是关于优化 Postgres 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何优化这个 Postgres 查询?

优化 Postgres 查询

Postgres:优化查询“WHERE id IN (...)”

Postgres 中的慢查询优化

优化 Postgres 对时间戳范围的查询

如何在 Postgres 中优化此查询