假设我有一张桌子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中是如何工作的。
答案 0 :(得分:3)
没有性能(在这种情况下也是执行)的区别。将使用哪个索引取决于数据和统计信息,只需使用EXPLAIN
来检查数据库首选哪个索引。在所描述的情况下,2列的索引将是最合适的。
您无法在视图上创建索引,因为PostgreSQL将视图视为普通SQL
语句并将其存储。在视图内部发出查询时,会在计划开始之前重写和转换查询。您可以阅读有关PostgreSQL如何处理请求in the docs的更多信息。这将针对目前正在积极开发的Materialized Views进行更改。
此外,您始终可以使用EXPLAIN ANALYZE
检查 如何处理此查询或该查询,并比较包含和不包含视图的案例的执行计划。