【发布时间】:2020-09-17 20:14:00
【问题描述】:
给定下表car_year的车型年份:
| id | maker | model | year |
----------------------------------
| 6 | Audi | Allroad | 2001 |
| 12 | Audi | A8 | 2008 |
| 14 | Ford | Mustang | 1996 |
| 15 | Honda | Civic | 2000 |
| 19 | Honda | Insight | 2000 |
| 22 | Ford | F150 | 2009 |
| 24 | Honda | Accord | 2000 |
| 28 | Ford | F150 | 2007 |
| 34 | Audi | S8 | 2002 |
| 48 | Ford | Expedition | 2011 |
| 62 | Ford | Escort | 2004 |
| 81 | Ford | Explorer | 2007 |
| 84 | Ford | Escape | 2006 |
| 93 | Honda | Accord | 1995 |
我想为“制造商的最早模型”提供一个覆盖索引。 我的解决方案是创建一个物化视图:
CREATE MATERIALIZED VIEW earliest AS
SELECT DISTINCT ON(maker) maker, model
FROM car_year
ORDER BY maker, year
然后是覆盖索引:
CREATE INDEX earliest_index ON earliest(maker) INCLUDE (model);
有效!但是物化视图是无用(对我来说),因为我只会使用覆盖索引。 我错过了更优雅的解决方案,还是我不知道的 (Postgre)SQL 功能?
【问题讨论】:
-
为什么不将覆盖索引应用于基表?
-
我只需要最早的 模型,而不是制造商的所有模型。如果我在基表上创建索引,
SELECT model FROM car_year WHERE maker = 'ford'将返回 7 行,而它应该只返回 1 和“Mustang”。 -
使用
DISTINCT?
标签: sql postgresql materialized-views covering-index