PostgreSQL View 创建巨大的临时文件

标签 postgresql view

我在 Postgres 中有 3 个相当简单的表,用于记录几年前每个业务日期的有效 ID。这三个表代表记录来自这些 ID 的事件的 3 个来源。我不能给你整个表格,但想象一下:

    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 在所有日期都显示在所有表中,因此我想要的只是一个 View ,它为我提供在任何日期的任何表上显示的任何 ID 的主列表。简单:

    create view all_ids as 
    select distinct * from table1 union 
    select distinct *  from table2 union
    select distinct * from table3;

View 创建没有任何问题,但无法查询。如果我想查看单个 id 在哪几天出现,我会写:

    select * from all_ids where id=37;

问题是当 Postgres 运行这个查询时,它首先尝试创建一个巨大的临时表,它是 3 个表的联合。不幸的是,这超过了 temp_file_limit (5767168kB),并且由于我不是管理员,所以我无法更改 temp_file_limit。无论如何,这似乎与我对 View 如何工作的理解相矛盾。请注意:我可以从任何单独的表中查询一个 id 或 id 列表。

我可以把它写成一个可以传递特定 ID 的函数,但是我再次相信, View 本身应该通过返回我所要求的内容来处理这个问题,而不是先在内存中创建数据域,然后然后从中选择。

其他相关信息是我们使用的是旧版本的 Postgres,9.2.23。我认为它处理 View 的方式有问题。答案可能是让管理员升级它。

有什么想法吗?

最佳答案

您正在寻找的是物化 View 。我只会引用文档::

CREATE VIEW 定义查询的 View 。 View 不是物理实体化的。相反,每次在查询中引用 View 时都会运行查询。

您创建的 View all_ids,如您所说,每次引用此 View 时都会重新创建

编辑适用于 Postgres 9.3+

关于PostgreSQL View 创建巨大的临时文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48348067/

相关文章:

postgresql - Amazon RDS 不支持扩展 "mysql_fdw"

oracle - 如何使用 ora2pg 迁移导出特定的表架构和数据?

javascript - Rails 复选框隐藏字段类

menu - vaadin View 子菜单代码

ios - CGRect.offsetBy 不工​​作

Swift:切换 View 后使用 UILongPressGestureRecognizer 时应用程序崩溃

ruby-on-rails - 一个接一个地保存和提交新记录,而不是在 block 的末尾

带有时间戳的 postgreSQL 排序

python - 找不到网址 Django

postgresql - Golang 如何使 sql 行成为一个字符串