首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >视图计算的列如何影响性能?

视图计算的列如何影响性能?
EN

Stack Overflow用户
提问于 2016-01-17 11:29:39
回答 1查看 557关注 0票数 2

我从这个问题了解到,SQL语言确实支持视图中的计算列。

我有一个有多列表的要求,为了简化查询,我需要计算一个排序列。我正在考虑为我的原始表创建一个视图,并计算出这些排序列。但随着我的桌子越来越大,恐怕这会是一场恶梦。

有没有人知道这将如何影响性能?

是否可以在视图中的计算列上创建索引?

更新1:我正计划使用postgresql,但我对其他开源的替代方案(如MySQL )开放

更新2:按照N.B.的建议,

我不是Postgres用户,但是医生来了正在展示如何创建该视图以及如何对其进行索引。如果你正在使用Postgres,并且熟悉它--坚持使用它。所有数据库的工作原理几乎相同,但如果您对一个数据库更精通--没有理由改变它。至于它如何影响性能--无论是视图还是动态构造的查询--都是一样的。在查询时,视图只是一个巨大的帮助,如果您可以对其进行索引,这意味着一些内存将花费在索引上。你必须测量

现在我认为物化视图是满足我的功能需求的方法,我可以设置一个触发器来刷新表中的每个更新的物化视图,一旦我确认了这一点:

  • REFRESH MATERIALIZED VIEW是如何工作的?它会从零开始删除数据并重新创建视图吗?还是它做了一些不同的刷新?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-18 08:33:09

免责声明:我只在远程服务器上使用了MySQL和PostgreSQL数据库大约8个月,对于您的用例,我更喜欢PostgreSQL。

TL;DR

  1. 根据文档,如果添加了REFRESH MATERIALIZED VIEW子句,WITH DATA命令将删除所有数据并重新填充整个查询的数据。
  2. 您可以为物化视图创建索引。索引可以放在存储在列中的计算字段上。
  3. 不能索引视图(非物化)
  4. 您可以根据需要创建不同类型的物化视图(请参阅下面的URL链接)。

长篇解释

( A)物化视图类型和性能

我有一个有多列表的要求,为了简化查询,我需要计算一个排序列。我正在考虑为我的原始表创建一个视图,并计算出这些排序列。但随着我的桌子越来越大,恐怕这会是一场恶梦。

如果计算非常昂贵,请考虑使用更多的内存将结果存储在物化视图或表中。

物化视图就像存储查询结果的表。在PostgreSQL物化视图的情况下,可以在其上创建索引以加快查询速度,并且可以对其进行空分,以更新元数据。

PostgreSQL提供的物化视图是一个幼稚的视图,因为您必须使用REFRESH MATERIALIZED VIEW命令手动刷新数据。根据文档,如果添加WITH DATA子句,这将删除所有数据并重新填充数据。

之后,您需要考虑插入、更新、删除操作所需的性能:

  1. 如果您没有实时需求(即完整的表重新填充是可以接受的),那么这个选项是可以的。
  2. 否则,您可能希望看到这个网站发布了不同的物化视图设置,其中有些允许延迟刷新数据(按行触发刷新数据) https://hashrocket.com/blog/posts/materialized-view-strategies-using-postgresql

第二点也适用于MySQL (实际上是构建物化视图的传统和定制方式)。据我所知,MySQL不支持即插即用的物化视图(需要插件)。(1)中提供的方便是我选择PostgreSQL的原因之一。

是否可以在视图中的计算列上创建索引?

可以对物化视图的列进行索引,就像对表进行索引一样。

( B) PostgreSQL中的窗口函数

选择PostgreSQL而不是MySQL的第二个原因是前者提供了扩展-SQL函数(或者我想称它们为OLAP函数),这些函数有助于处理复杂的查询,比如行的排序等等。

我将让您探索这个选项(只需在"PostgreSQL窗口函数“上进行谷歌搜索)。

根据我的最新知识,MySQL没有内置支持这一点(可能依赖插件或自己的编码?)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34837814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档