【发布时间】:2018-04-01 14:27:07
【问题描述】:
我有一个表,该表在时间戳和时区字段上进行范围分区。我很惊讶地发现以下 where 条件导致规划器查询分区中的每个“子”表:
WHERE reading_time > (now() - '72:00:00'::interval)
据我所知,计划器不知道 now() 在执行时会是什么,因此它会生成查询每个子表的计划。这是可以理解的,但这违背了设置分区的初衷!如果我发出 reading_time > '2018-03-31',它只会对具有满足这些条件的数据的表进行索引扫描。
如果我创建以下函数会发生什么
CREATE OR REPLACE FUNCTION public.last_72hours(in_time timestamp with time zone)
Select * from precip where reading_time > (in_time - '72:00:00'::interval)
--the function will then do work on the returned rows
END;
然后我可以调用函数
SELECT last_72hours(now())
now() 何时被评估?或者,换句话说,是否将文字时间值(例如,2018-03-31 1:01:01+5)传递到函数中?如果是字面值,那么 Postgres 只会查询相应的子表,对吧?但是,如果它在函数内部评估 now(),那么我将回到扫描每个子表索引的计划。似乎很难看到计划者在函数中做了什么。对吗?
【问题讨论】:
标签: postgresql postgresql-10 query-planner