我从这个问题了解到,SQL语言确实支持视图中的计算列。
我有一个有多列表的要求,为了简化查询,我需要计算一个排序列。我正在考虑为我的原始表创建一个视图,并计算出这些排序列。但随着我的桌子越来越大,恐怕这会是一场恶梦。
有没有人知道这将如何影响性能?
是否可以在视图中的计算列上创建索引?
更新1:我正计划使用postgresql,但我对其他开源的替代方案(如MySQL )开放
更新2:按照N.B.的建议,:
我不是Postgres用户,但是医生来了正在展示如何创建该视图以及如何对其进行索引。如果你正在使用Postgres,并且熟悉它--坚持使用它。所有数据库的工作原理几乎相同,但如果您对一个数据库更精通--没有理由改变它。至于它如何影响性能--无论是视图还是动态构造的查询--都是一样的。在查询时,视图只是一个巨大的帮助,如果您可以对其进行索引,这意味着一些内存将花费在索引上。你必须测量
现在我认为物化视图是满足我的功能需求的方法,我可以设置一个触发器来刷新表中的每个更新的物化视图,一旦我确认了这一点:
REFRESH MATERIALIZED VIEW
是如何工作的?它会从零开始删除数据并重新创建视图吗?还是它做了一些不同的刷新?发布于 2016-05-18 08:33:09
免责声明:我只在远程服务器上使用了MySQL和PostgreSQL数据库大约8个月,对于您的用例,我更喜欢PostgreSQL。
TL;DR
REFRESH MATERIALIZED VIEW
子句,WITH DATA
命令将删除所有数据并重新填充整个查询的数据。长篇解释
( A)物化视图类型和性能
我有一个有多列表的要求,为了简化查询,我需要计算一个排序列。我正在考虑为我的原始表创建一个视图,并计算出这些排序列。但随着我的桌子越来越大,恐怕这会是一场恶梦。
如果计算非常昂贵,请考虑使用更多的内存将结果存储在物化视图或表中。
物化视图就像存储查询结果的表。在PostgreSQL物化视图的情况下,可以在其上创建索引以加快查询速度,并且可以对其进行空分,以更新元数据。
PostgreSQL提供的物化视图是一个幼稚的视图,因为您必须使用REFRESH MATERIALIZED VIEW
命令手动刷新数据。根据文档,如果添加WITH DATA
子句,这将删除所有数据并重新填充数据。
之后,您需要考虑插入、更新、删除操作所需的性能:
第二点也适用于MySQL (实际上是构建物化视图的传统和定制方式)。据我所知,MySQL不支持即插即用的物化视图(需要插件)。(1)中提供的方便是我选择PostgreSQL的原因之一。
是否可以在视图中的计算列上创建索引?
可以对物化视图的列进行索引,就像对表进行索引一样。
( B) PostgreSQL中的窗口函数
选择PostgreSQL而不是MySQL的第二个原因是前者提供了扩展-SQL函数(或者我想称它们为OLAP函数),这些函数有助于处理复杂的查询,比如行的排序等等。
我将让您探索这个选项(只需在"PostgreSQL窗口函数“上进行谷歌搜索)。
根据我的最新知识,MySQL没有内置支持这一点(可能依赖插件或自己的编码?)。
https://stackoverflow.com/questions/34837814
复制相似问题