视图和索引对性能的影响

时间:2013-02-19 07:36:44

标签: sql postgresql

假设我有一张桌子foo:

CREATE TABLE FOO (
    FOO_ID INTEGER,
    STATUS INTEGER,
    RATING INTEGER,
    PRIMARY KEY ("FOO_ID")
)

其中status可以在0到5之间,表格中有行。

然后我们说我创建一个关于状态的索引,另一个关于评级:

CREATE INDEX ON FOO (STATUS);
CREATE INDEX ON FOO (RATING);

现在,假设我有一个观点:

CREATE VIEW FOO_THREE_VIEW AS
  SELECT * 
  FROM FOO
  WHERE STATUS = 3;

我想获取foo中的记录:STATUS = 3RATING = 5。以下查询将为我提供我想要的结果:

SELECT * FROM FOO WHERE STATUS = 3 AND RATING = 5;

但是,以下查询也会给我我想要的结果:

SELECT * FROM FOO_THREE_VIEW WHERE RATING = 5;

在两个查询中,是否存在性能差异? 第一个查询是否从两个索引中受益?第二个查询是否从两个索引中受益?我无法在视图上创建索引来帮助提高性能,对吗?如果两个列上都有索引(如CREATE INDEX ON FOO (STATUS, RATING)而不是两个单独的索引),两者的性能会如何变化?

我理解这个问题可能是一般的SQL问题,但是当需要规范时,我想知道它在PostgreSQL中是如何工作的。

1 个答案:

答案 0 :(得分:3)

没有性能(在这种情况下也是执行)的区别。将使用哪个索引取决于数据和统计信息,只需使用EXPLAIN来检查数据库首选哪个索引。在所描述的情况下,2列的索引将是最合适的。

您无法在视图上创建索引,因为PostgreSQL将视图视为普通SQL语句并将其存储。在视图内部发出查询时,会在计划开始之前重写和转换查询。您可以阅读有关PostgreSQL如何处理请求in the docs的更多信息。这将针对目前正在积极开发的Materialized Views进行更改。

此外,您始终可以使用EXPLAIN ANALYZE检查 如何处理此查询或该查询,并比较包含和不包含视图的案例的执行计划。