2013-02-19 46 views
2

比方说,我有一个表foo:,享有业绩的影响和指数

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

其中状态可以是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中的具体工作方式。

回答

3

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

您不能在视图上创建索引,因为PostgreSQL将视图作为普通的SQL语句对待和存储。在内部对查看执行查询时,查询在计划开始前会被重写和转换。您可以阅读更多关于PostgreSQL如何处理您的请求in the docs。这将改变为Materialized Views,目前正在积极开发。

此外,您总是可以使用EXPLAIN ANALYZE来检查如何这个或那个查询将被处理,并比较有和没有涉及视图的情况下的执行计划。