PostgreSQL中跨多个表的索引

PostgreSQL中跨多个表的索引,sql,postgresql,Sql,Postgresql,在PostgreSQL中,是否可以在包含多个表的字段的表达式上放置索引。例如,一个索引可以加速以下形式的查询: SELECT *, (table1.x + table2.x) AS z FROM table1 INNER JOIN table2 ON table1.id = table2.id ORDER BY z ASC 不,这在任何当前发布的SQL dbms中都是不可能的。Oracle支持,但这可能与此无关。我不清楚您是只想在多个表的联接列上建立索引,还是想在联接表的任意列上建立索引 要确

在PostgreSQL中,是否可以在包含多个表的字段的表达式上放置索引。例如,一个索引可以加速以下形式的查询:

SELECT *, (table1.x + table2.x) AS z
FROM table1
INNER JOIN table2
ON table1.id = table2.id
ORDER BY z ASC

不,这在任何当前发布的SQL dbms中都是不可能的。Oracle支持,但这可能与此无关。我不清楚您是只想在多个表的联接列上建立索引,还是想在联接表的任意列上建立索引


要确定性能问题的真正根源,请学习阅读PostgreSQL的输出。

不,在许多表上都不可能有索引,而且它也不能保证加快任何速度,因为您不会总是获得仅索引的扫描。你真正想要的是a,但pg也没有。您可以尝试使用触发器自己实现它


更新
正如@petter所指出的。物化视图。

实际上没有性能问题。大多数时间都是通过对表达式进行排序来消耗的,我希望能够使用表扩展索引进一步加快查询速度。剩下的时间主要用于索引扫描和散列连接,我认为我无法加快这些速度。我的问题主要是出于好奇,因为我找不到任何关于它的信息。不,正如Jakub Kania所说,PostgreSQL中的解决方法需要触发器。(因为PostgreSQL还不支持物化视图。)@EwoutKleinsmann好吧,如果你真的想的话,我想也有机会创建一个函数(table1.id,table1.x),它可以在table2上进行查询,并确定它是不可变的,这样就可以在上面创建索引。但是它不可靠,因为它不会自动更新,不可靠,因为它不能保证它会被使用,而且速度慢,因为函数上没有IOS,所以会选择正确的行,然后函数会再次运行。因此,我想如果您从按t1.x+t2.x排序的500万行中选择前10行,速度会更快,但触发器也可以做得更好。出于简单的情况和性能原因,触发器不是比物化视图更理想、更简单吗?假设整个视图是物化的,只需将表达式或值复制到带有触发器的表中,然后引用该触发器,成本会低很多。我相信有一种方法可以避免物化的某些方面,但是简单物化的直接方法并不便宜,而且会因为重复而降低很多速度。也许Oracle&MSSQL可以为逐字表列引用使用/继承基础表,但我不确定这是否可行。这不是触发器。每个基础表上的每个操作都需要触发器。这可能是很多程序代码。我认为,能够用一条SQL语句替换大量过程代码更可取,也不那么复杂。这是否更便宜是实现质量的问题。PostgreSQL 9.3支持创建物化视图,9.4应该扩展其可用性。您可以在一个表中的多个列上创建索引。不能对两个不同表中的列创建索引。我很确定这适用于所有当前的SQL dbms,而不仅仅是PostgreSQL。从9.3版开始,PostgreSQL支持物化视图:@petter 9.3在我写这篇文章时并不存在。无论如何更新。谢谢