postgresql - 过滤数据库 View 比直接查询慢得多

标签 postgresql

我注意到在执行常规查询与创建数据库 View 然后查询 View 时查询计划有很大不同。

案例一基本查询:

SELECT <somequery> WHERE <some-filter> <some-group-by>

案例2数据库 View :

CREATE VIEW myview AS SELECT <some-query> <some-group-by>;
SELECT FROM myview WHERE <some-filter>;

我注意到,在这种情况下,2 个 postgres 将加入/聚合所有可能的东西,然后才应用过滤器。在情况 1 中,它不涉及使用 where 子句过滤掉的行。所以情况 2 慢很多。

在保持数据库 View 的同时,是否有任何技巧可以解决这个问题?

最佳答案

每次执行 SELECT FROM 时,您的 View 都必须重新创建要过滤的数据集。

最简单的方法是将 View 更改为物化 View 。如果您的数据不是每 2 分钟更改一次,物化 View 将保存要使用的选择,然后您的过滤器可以在“已保存”数据集上工作。您可以做的第二件事是在 View 上添加索引。

此处示例:https://hashrocket.com/blog/posts/materialized-view-strategies-using-postgresql

create materialized view matview.account_balances as
select
  name,
  coalesce(
    sum(amount) filter (where post_time <= current_timestamp),
    0
  ) as balance
from accounts
  left join transactions using(name)
group by name;

create index on matview.account_balances (name);
create index on matview.account_balances (balance);

这是减少查询运行时间的最简单方法。 希望这会有所帮助。

关于postgresql - 过滤数据库 View 比直接查询慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37213595/

相关文章:

postgresql - postgres - 更新 jsonb 数组的语法

sql - 根据日期选择费率

linux - 创建postgres数据库时如何指定表空间?

hibernate - Spring + Hibernate + Postgresql readOnly Transaction,按需保存

python - 如何将值插入 SQLAlchemy TIMESTAMP 列

mysql - 优化生成的字符串以存储到数据库中

postgresql - 将 Docker PostgreSQL 数据存储到 Azure 存储帐户

javascript - 如何通过postgresql插入数据库

ruby-on-rails - 初始查询后的 ActiveRecord 预加载

mysql - 对嵌套的外键关系执行 SUM