我从this question了解到SQL语言确实支持视图中的计算列。
我有一个要求,我有一个包含多列的表,我需要计算一个排序列,以简化我的查询。我正在考虑使用计算的排序列为我的原始表创建一个视图。但是,当我的桌子越来越大时,我担心这可能是一场表演的噩梦。
是否有人知道这将如何影响性能?
是否可以在视图中的计算列上创建索引?
更新1: 我打算使用postgresql,但我对其他开源替代品如MySQL
持开放态度更新2: 如N.B.所示:
我不是Postgres用户,但是docs here正在展示如何创建该视图以及如何对其进行索引。如果你正在使用Postgres并熟悉它 - 坚持下去。所有数据库的工作方式几乎相同,但如果您对某一数据库更加熟练 - 没有理由对其进行更改。至于它如何影响性能 - 无论是动态构建的视图还是查询 - 它都是一样的。在查询时,View只是一个巨大的帮助,如果你可以索引它,那意味着将在索引上花费一些内存。你必须衡量
我现在想的是物化视图是我的功能需求的方法,我可以设置一个触发器,一旦我确认这一点,就刷新我桌子上每次更新的物化视图:
REFRESH MATERIALIZED VIEW
如何运作?它会丢弃数据并从头开始重新创建视图吗?还是做某种差别刷新?答案 0 :(得分:1)
免责声明:我已经在远程服务器上使用了MySQL和PostgreSQL数据库大约8个月,我根据您的使用情况优先选择PostgreSQL。
REFRESH MATERIALIZED VIEW
如果添加WITH DATA
子句,命令将删除所有数据并重新填充整个查询的数据。我有一个要求,我有一个包含多列的表,我需要计算一个排序列,以简化我的查询。我正在考虑使用计算的排序列为我的原始表创建一个视图。但是,当我的桌子越来越大时,我担心这可能是一场表演的噩梦。
如果计算非常昂贵,请考虑使用更多内存将结果存储在物化视图或表格中。
物化视图就像存储查询结果的表。在PostgreSQL物化视图的情况下,可以在其上创建索引以加速查询,并且可以对其进行清理以更新元数据。
PostgreSQL提供的物化视图很简单,因为您必须使用REFRESH MATERIALIZED VIEW
命令手动刷新数据。根据文档,如果添加WITH DATA
子句,这将删除所有数据并重新填充数据。
之后,您需要考虑插入,更新和删除操作所需的性能:
第二点也适用于MySQL(实际上是构建物化视图的传统和自定义方式)。据我所知,MySQL不支持开箱即用的物化视图(需要插件)。 (1)中提供的便利是我选择PostgreSQL的原因之一。
是否可以在视图中的计算列上创建索引?
可以为物化视图的列编制索引,就像对表格一样。
选择PostgreSQL而不是MySQL的第二个原因是因为前者提供了扩展SQL函数(或者我想称之为OLAP函数),这些函数可以帮助处理复杂的查询,例如行的排序等等。
我将留给您探索此选项(只需对“PostgreSQL窗口函数”进行Google搜索)。
根据我的最新知识,MySQL没有内置支持(可能依赖于插件或自己编码?)。