视图计算列如何影响性能?
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 上的每个更新的实体化视图:
REFRESH MATERIALIZED VIEW
是如何工作的?它会删除数据并从头开始重新创建视图吗?还是它会进行某种差异刷新?
免责声明:我在远程服务器上同时使用 MySQL 和 PostgreSQL 数据库仅约 8 个月,我更喜欢 PostgreSQL 为您的用例。
TL;DR
- 根据文档,
REFRESH MATERIALIZED VIEW
如果添加 WITH DATA
子句,命令将删除所有数据并重新填充整个查询的数据。
- 您可以为物化视图创建索引。索引可以位于存储在列中的计算字段上。
- 您不能索引视图(非物化)
- 您可以根据需要创建不同类型的物化视图(请参阅下面的 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
子句,这将删除所有数据并重新填充数据。
之后,您需要考虑插入、更新、删除操作所需的性能:
- 如果您没有实时要求(即完整 table
重新填充是 acceptable) 那么这个选项就可以了。
- 否则,您可能希望查看此网站 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 没有对此的内置支持(可能依赖插件或自己的编码?)。
我从 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 上的每个更新的实体化视图:
REFRESH MATERIALIZED VIEW
是如何工作的?它会删除数据并从头开始重新创建视图吗?还是它会进行某种差异刷新?
免责声明:我在远程服务器上同时使用 MySQL 和 PostgreSQL 数据库仅约 8 个月,我更喜欢 PostgreSQL 为您的用例。
TL;DR
- 根据文档,
REFRESH MATERIALIZED VIEW
如果添加WITH DATA
子句,命令将删除所有数据并重新填充整个查询的数据。 - 您可以为物化视图创建索引。索引可以位于存储在列中的计算字段上。
- 您不能索引视图(非物化)
- 您可以根据需要创建不同类型的物化视图(请参阅下面的 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
子句,这将删除所有数据并重新填充数据。
之后,您需要考虑插入、更新、删除操作所需的性能:
- 如果您没有实时要求(即完整 table 重新填充是 acceptable) 那么这个选项就可以了。
- 否则,您可能希望查看此网站 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 没有对此的内置支持(可能依赖插件或自己的编码?)。