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

How does views calculated columns impact performance?

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

我有一个要求,我有一个包含多个列的 table,我需要计算一个排序列以简化我的查询。我正在考虑为我的原点 table 创建一个视图,并计算出那些排序列。但我担心随着我的 table 变大,这可能会成为性能噩梦。

有人知道这会如何影响性能吗?

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


更新 1: 我打算使用 postgresql,但我对其他开源替代方案持开放态度,例如 MySQL


更新 2: 正如 建议的那样:

I'm not a Postgres user, but the docs here are showing how to create that view and how to index it. If you're using Postgres and are familiar with it - stick with it. All databases work nearly the same, but if you're more proficient with one - no reason to change it. As for how it affects the performance - be it a view or a query that you construct dynamically - it's the same thing. View is just a huge help when querying, and if you can index it it means some memory will be spent on index. You have to measure

我现在认为实体化视图是满足我的功能需求的方式,一旦我确认这一点,我可以设置一个触发器来刷新 table 上的每个更新的实体化视图:

免责声明:我在远程服务器上同时使用 MySQL 和 PostgreSQL 数据库仅约 8 个月,我更喜欢 PostgreSQL 为您的用例。

TL;DR

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

详细说明

A) 物化视图类型和性能

I have a requirement where I have a table with multiple columns, and I need to calculate a sorting column in order to simplify my queries. I am thinking of creating a view for my origin table with those sorting columns calculated. But I am afraid that could be a performance nightmare as my table grows bigger.


如果计算量很大,考虑消耗更多的内存将结果存储在物化视图或tables中。

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

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

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

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


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

的原因之一

Is it possible to create index on a calculated column in a view ?

可以索引实体化视图的列,就像您对 table 所做的那样。

B) Window Postgre 中的函数SQL

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

我将留给您探索此选项(只需在 "PostgreSQL Window Functions" 上进行 Google 搜索)。

据我最新了解,MySQL 没有对此的内置支持(可能依赖插件或自己的​​编码?)。