我注意到在执行常规查询与创建数据库 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/