我注意到在进行常规查询时,查询计划与创建数据库视图然后查询视图有很大不同。
案例1基本查询:
for /r "c:\" %%i in (excel.exe) do (echo -- %%i & goto :eof)
案例2数据库视图:
SELECT <somequery> WHERE <some-filter> <some-group-by>
我注意到在这种情况下,2 postgres将加入/聚合所有可能的东西,然后才应用过滤器。在案例1中,它不会触及使用where子句过滤掉的行。因此案例2要慢得多。
在保持数据库视图的同时,是否有任何技巧可以解决这个问题?
答案 0 :(得分:0)
每次执行SELECT FROM时,您的视图都必须重新创建要过滤的数据集。
最简单的方法是将视图更改为实体化视图。如果您的数据不是每2分钟更改一次,则物化视图将保存要使用的选择,然后您的过滤器可以处理“已保存”的数据集。您可以做的第二件事是在视图上添加索引。
此处示例: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);
这是减少查询运行时的最简单方法。 希望这会有所帮助。