- PostgreSQL 18 引入了虚拟生成列这一新特性,该特性在查询时实时计算值,与将值持久化存储在磁盘上的存储生成列形成鲜明对比。
- 生成列通过将逻辑封装在数据附近,有效减少了样板代码,从而提升了模式的可维护性并降低了重复性。
- 虚拟生成列特别适合轻量级表达式或需要避免存储膨胀的场景,而存储生成列则更适用于需要建立索引的高开销表达式。
- 生成列的一个典型应用场景是全文检索(FTS),可以将不同语言的配置存储为生成列并建立索引以实现高效查询。
- 虚拟生成列在将JSON字段暴露为常规列时尤其有用,它无需在磁盘上复制数据即可提供更简洁的查询接口,且不产生存储开销。
- 性能方面存在权衡:存储列会增加写入开销但通过索引加速读取,而虚拟列保持写入轻量但需要在读取时进行计算。
- 虚拟列使模式演进更为便捷,无需重写表即可即时添加,这使其成为生产环境中进行实验的理想选择。
- 生成列存在一定限制和安全风险,特别是涉及自定义函数或用户定义类型时,需要谨慎规划以避免意外行为。