2

假设我有一张桌子 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 中是如何工作的。

4

1 回答 1

3

不会有性能(在这种情况下也是执行)差异。将使用哪个索引取决于数据和统计信息,仅用于EXPLAIN检查数据库首选哪个索引。在所描述的情况下,两列上的索引将是最合适的。

您不能在视图上创建索引,因为 PostgreSQL 将视图视为普通SQL语句并将其存储。当您针对视图发出查询时,在内部,查询会在计划开始之前被重写和转换。您可以在文档中阅读有关 PostgreSQL 如何处理您的请求的更多信息。这将改变目前正在积极开发的物化视图。

您还可以随时EXPLAIN ANALYZE检查如何处理这个或那个查询,并比较涉及和不涉及视图的案例的执行计划。

于 2013-02-19T07:53:05.520 回答