我在Postgres中有3个相当简单的表格,记录哪些ID对于可追溯到几年的每个商业日期都有效。这三个表代表3个来自这些ID记录活动的来源。我无法给你整张桌子,但想象一下:
Date ID
2000-01-02 1
2000-01-02 2
2000-01-02 3
2000-01-02 4
. . .
2018-01-02 49997
2018-01-02 49998
2018-01-02 49999
2018-01-02 50000
因此每个表都有每日数据,可能有数万个ID。并非所有ID都显示在所有表中的所有日期,所以我想要的是一个视图,它给出了任何日期在任何表上显示的任何ID的主列表。简单:
create view all_ids as
select distinct * from table1 union
select distinct * from table2 union
select distinct * from table3;
创建视图没有任何问题,但证明无法查询。如果我想查看单个ID出现的日期,我会写:
select * from all_ids where id=37;
问题是当Postgres运行此查询时,它首先尝试创建一个巨大的临时表,它是3个表的并集。遗憾的是,这超过了temp_file_limit(5767168kB),因为我不是管理员,所以我无法更改temp_file_limit。无论如何,这似乎与我对观点如何运作的理解相矛盾。请注意:我可以从任何单个表中查询id或id列表。
我可以把它写成一个我可以传递特定ID的函数,但是我再次相信,视图本身应该通过返回我要求的内容而不是首先在内存中创建数据的范围来处理这个问题。然后从中选择。
其他相关信息是我们使用旧版Postgres,9.2.23。我在想它是如何处理视图的。答案可能是错误管理员升级它。
有什么想法吗?
答案 0 :(得分:-1)
您要找的是materialized views
。我将引用docs ::
CREATE VIEW defines a view of a query. The view is not physically materialized. Instead, the query is run every time the view is referenced in a query.
您创建的视图all_ids
与您说的一样,每次引用此视图时都会获得re-created
。
修改适用于Postgres 9.3 +