我注意到我的代码中有以下查询,并想检查是否可以优化它。
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 - 时间戳
答案 0 :(得分:0)
过早优化是数据库中所有邪恶的根源。设计时要考虑到理智,然后在遇到问题时告诉我们。我没有回答这个问题,而是解释为什么无法回答。
SQL是一种声明性语言,您可以在其中为数据库系统提供某种类似数学公式的内容,并指出如何以最佳方式运行它。好吧,从技术上讲,查询是一个数学公式,但数学镜像SQL和SQL近似于另一个称为关系代数的数学领域。
实际的优化过程在很大程度上取决于读写模式,以及规划者知识的局限性。除非你有一个实际的瓶颈,否则没有办法评估一个查询相对于另一个查询的相对性能,除非你做了你的例子中没有的某些事情(NOT EXISTS
往往是昂贵的,而且往往会更好地编写它作为外连接并过滤内连接的情况而不是作为反连接的情况。可能这将在未来解决)。即使在那里,也有很多情况下,反连接不会产生很大的影响,而且性能的提升可能不值得担心。
所以重点是在优化查询之前需要等到实际问题。然而,优化存储是非常不同的。