是否可以在非实现视图上建立索引?

Nat*_*ong 1 postgresql

在PostgreSQL中,可以在非实例化视图上建立索引吗?

我在应用程序中使用视图,它基本上可以很好地工作,但是我想加快对其数据的访问。我可以切换到实例化视图,但是我不想刷新它。

Nat*_*ong 5

没有

来自http://postgresql.nabble.com/Indexes-not-allowed-on-read-only-views-Why-td4812152.html

在postgres中,视图本质上是宏,因此没有要索引的数据

普通(非实体化)视图自身没有任何数据,它在查询执行过程中即时将其从一个或多个其他表中提取。视图的执行有点类似于返回集合的函数或子查询,就像您将视图定义替换为原始查询一样。

这意味着该视图将使用原始表上的所有索引,但实际上甚至没有机会检查视图自身的索引,因为该视图的定义已被有效地替换为查询。如果视图定义足够复杂,以至于在原始表的索引无济于事的情况下进行了大量工作,则必须每次都进行该工作。

CAN做的是使用触发器来维护自己的物化视图的常规表,并且对你保持使用触发器表的索引。在邮件列表中对此进行了广泛的讨论,虽然很难使更新在某些实例化视图查询中表现良好,但并不难。