首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >视图和索引对性能的影响

问视图和索引对性能的影响
EN

Stack Overflow用户
提问于 2013-02-19 15:36:44
回答 1查看 132关注 0票数 2

假设我有一个表foo:

代码语言:javascript
复制
CREATE TABLE FOO (
    FOO_ID INTEGER,
    STATUS INTEGER,
    RATING INTEGER,
    PRIMARY KEY ("FOO_ID")
)

其中status可以介于0和5之间,并且表中填充了行。

然后假设我创建了一个关于状态的索引,以及另一个关于评级的索引:

代码语言:javascript
复制
CREATE INDEX ON FOO (STATUS);
CREATE INDEX ON FOO (RATING);

现在,假设我有一个视图:

代码语言:javascript
复制
CREATE VIEW FOO_THREE_VIEW AS
  SELECT * 
  FROM FOO
  WHERE STATUS = 3;

我想要获取foo中的记录:STATUS = 3和RATING = 5。下面的查询将给出我想要的结果:

代码语言:javascript
复制
SELECT * FROM FOO WHERE STATUS = 3 AND RATING = 5;

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

代码语言:javascript
复制
SELECT * FROM FOO_THREE_VIEW WHERE RATING = 5;

在这两个查询中,是否存在性能差异?第一个查询是否同时受益于这两个索引?第二个查询是否从这两个索引中受益?我不能在视图上创建索引来帮助提高性能,对吗?如果两个列上都有一个索引,比如CREATE INDEX ON FOO (STATUS, RATING),而不是两个单独的索引,那么这两个列的性能会发生怎样的变化?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-19 15:53:06

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

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14952160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档