1

我有一个 PostgreSQL 9.6 服务器连接到远程 9.3 服务器。

我正在尝试创建以下物化视图:

CREATE MATERIALIZED VIEW test AS
  SELECT id
  FROM remote.logs
  WHERE remote.logs.created_at > (now() - interval '1 day')

它很慢,因为过滤是在本地服务器上完成的。

这是解释分析结果:

Foreign Scan on integration.logs  (cost=100.00..219.69 rows=975 width=4)
  Output: id
  Filter: (logs.created_at > (now() - '1 day'::interval))
  Remote SQL: SELECT id, created_at FROM public.logs

如何在远程服务器上进行条件过滤?

注意:远程过滤正在使用这样的查询:

CREATE MATERIALIZED VIEW test AS
  SELECT id
  FROM integration.logs
  WHERE integration.logs.created_at > (timestamp 'now()' - interval'1 day')

Foreign Scan on integration.logs  (cost=100.00..166.06 rows=975 width=4)
  Output: id
  Remote SQL: SELECT id FROM public.logs WHERE ((created_at > '2017-05-31 11:44:10.89017'::timestamp without time zone))

但是有了这个,每次我刷新视图时,日期已经被计算出来并停留在上面的例子中 2017-05-31 11:44:10.89017

有任何想法吗 ?

谢谢并恭祝安康

4

1 回答 1

1

来自https://www.postgresql.org/docs/current/static/postgres-fdw.html

为了降低错误执行查询的风险,WHERE 子句不会发送到远程服务器,除非它们仅使用内置的或属于外部服务器扩展选项中列出的扩展的数据类型、运算符和函数。此类子句中的运算符和函数也必须是 IMMUTABLE。

函数now()不是不可变的——如果参数不变,它不会给出相同的结果。

如果您确实需要在远程服务器上执行 now() 来发送查询,那么您可以使用dblink

于 2017-06-01T10:06:51.250 回答