过滤数据库视图比直接查询慢得多

时间:2016-05-13 15:11:46

标签: postgresql

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

案例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要慢得多。

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

1 个答案:

答案 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);

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