7.8. 部分索引

作者: 这是从 Paul M. Aoki () 1998-08-11的在 e-mail 列表中回答的问题中摘下来的。

注意: 目前 PostgreSQL 并不支持 部分索引,但是它的前身 Postgres 曾经支持过部分索引,并且那些代码仍然在源码包中. 我们希望将来什么时候重新让它焕发青春.

部分索引(partial index) 是建立在一个表的子集上的索引;该子集是用断言(谓语)定义的。 Postgres 支持带有任意断 言(谓语)的部分索引。 我相信 IBM 用于 as/400 的 DB2 用单一子句的断言支持部分索引。

部分索引的主要动机是: 如果你发出的所有查询都可以从落在某个范围内的索引中获益, 我们为什么要对整个表建立一个 索引,而带来相关的更多的空间/时间开销呢? (还有其他原因;参阅 Stonebraker, M, 1989b 获取更多细节。)

创建,更新和查询部分索引的机制不算太差。 麻烦的部分是索引的选择(我该建立哪个索引?)和查询优化(我该使用哪 个索引?);也就是说, 涉及到决定什么样的断言可以有效地匹配工作负荷/查询的那部分。 对那些深入数据库理论的人 而言,这个问题基本上类似于对应的物化的视图问题, 只不过是有不同的开销参数和公式。通常而言,这些问题对标准的 SQL 类型是很难的问题;对黑盒扩展类型而言, 这些问题是超级难的问题,因为选择性评估理论太原始了。 (译注∶大多属于 NP 问题)

参考 Stonebraker, M, 1989bOlson, 1993, 和 Seshardri, 1995 获取更多信息。