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

时间:2016-01-17 11:29:39

标签: mysql sql performance postgresql database-performance

我从this question了解到SQL语言确实支持视图中的计算列。

我有一个要求,我有一个包含多列的表,我需要计算一个排序列,以简化我的查询。我正在考虑使用计算的排序列为我的原始表创建一个视图。但是,当我的桌子越来越大时,我担心这可能是一场表演的噩梦。

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

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

更新1: 我打算使用postgresql,但我对其他开源替代品如MySQL

持开放态度

更新2:N.B.所示:

  

我不是Postgres用户,但是docs here正在展示如何创建该视图以及如何对其进行索引。如果你正在使用Postgres并熟悉它 - 坚持下去。所有数据库的工作方式几乎相同,但如果您对某一数据库更加熟练 - 没有理由对其进行更改。至于它如何影响性能 - 无论是动态构建的视图还是查询 - 它都是一样的。在查询时,View只是一个巨大的帮助,如果你可以索引它,那意味着将在索引上花费一些内存。你必须衡量

我现在想的是物化视图是我的功能需求的方法,我可以设置一个触发器,一旦我确认这一点,就刷新我桌子上每次更新的物化视图:

  • REFRESH MATERIALIZED VIEW如何运作?它会丢弃数据并从头开始重新创建视图吗?还是做某种差别刷新?

1 个答案:

答案 0 :(得分:1)

免责声明:我已经在远程服务器上使用了MySQL和PostgreSQL数据库大约8个月,我根据您的使用情况优先选择PostgreSQL。

TL; DR

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

    A)物化视图类型和性能

      

    我有一个要求,我有一个包含多列的表,我需要计算一个排序列,以简化我的查询。我正在考虑使用计算的排序列为我的原始表创建一个视图。但是,当我的桌子越来越大时,我担心这可能是一场表演的噩梦。


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

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

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

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

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

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

        

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

      可以为物化视图的列编制索引,就像对表格一样。

      B)PostgreSQL中的窗口函数

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

      我将留给您探索此选项(只需对“PostgreSQL窗口函数”进行Google搜索)。

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