【发布时间】:2015-10-16 08:59:33
【问题描述】:
PostgreSQL 9.4 创建表如下:
CREATE TABLE foo (
id integer,
date date,
value numeric(14,3)
);
我正在使用ROW_NUMBER() 窗口函数和COALESCE 优化查询。为了最有效,我倾向于在以下查询中使用Index Only Scan:
SELECT id, c_val
FROM (
SELECT id, COALESCE(value, 0) c_val, ROW_NUMBER() OVER(PARTITION BY id ORDER BY date DESC NULLS LAST) rn
FROM foo) sbt
WHERE sbt.rn = 1;
所以,如果我按如下方式创建索引:
CREATE INDEX ON foo (id, date DESC NULLS LAST, value);
策划者选择使用Index Only Scan,但如果我这样做:
CREATE INDEX ON foo (id, date DESC NULLS LAST, COALESCE(value, 0));
计划者只会做Index Scan。
为什么?我试图避免在执行查询时评估COALESCE 函数的成本。为什么它不适用于Index Only Scan?
【问题讨论】:
-
coalesce()的“成本”几乎为零,不用担心。
标签: sql postgresql indexing internals