【问题标题】:Materialized view only for covering index仅用于覆盖索引的物化视图
【发布时间】: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


【解决方案1】:

如果我没听错的话,你是在要求一个“索引组织表”(或在这种情况下索引组织的物化视图),这是一个真正是索引的表。这样您就不必浪费两倍的存储空间,一次用于您从不使用的表,一次用于您想要对其执行仅索引扫描的索引。

答案是这样的“索引组织表”在 PostgreSQL 中不存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2019-12-22
    相关资源
    最近更新 更多