假设我有一个表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 = 3和RATING = 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中具体工作的。
发布于 2013-02-19 15:53:06
不会有性能(在这种情况下也是执行)的差异。将使用哪个索引取决于数据和统计信息,只需使用EXPLAIN检查数据库首选哪个索引即可。在上述情况下,2列上的索引将是最合适的。
您不能为视图创建索引,因为PostgreSQL将视图视为普通的SQL语句并将其存储。当您在内部对视图发出查询时,查询将在计划开始之前被重写和转换。您可以阅读有关PostgreSQL如何处理您的请求的更多信息,in the docs。对于目前正在积极开发的Materialized Views,这一点将有所改变。
此外,您可以始终使用EXPLAIN ANALYZE来检查这个或那个查询将如何处理,并比较包含和不包含视图的案例的执行计划。
https://stackoverflow.com/questions/14952160
复制相似问题