【发布时间】: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是一种将子查询限制为一行的糟糕方法,如果这是您的意图)
标签: sql database postgresql query-optimization