【发布时间】:2016-04-22 15:00:59
【问题描述】:
我从this question 了解到,SQL 语言确实支持视图中的计算列。
我有一个要求,我有一个包含多个列的表,并且我需要计算一个排序列以简化我的查询。我正在考虑为我的原始表创建一个视图,并计算出那些排序列。但我担心随着我的桌子越来越大,这可能是一场性能噩梦。
有人知道这会如何影响性能吗?
是否可以在视图中的计算列上创建索引?
更新 1: 我计划使用 postgresql,但我对 MySQL 等其他开源替代品持开放态度
更新 2: 正如N.B. 建议的那样:
我不是 Postgres 用户,但docs here 正在展示如何创建该视图以及如何为其编制索引。如果您正在使用 Postgres 并且熟悉它 - 坚持下去。所有数据库的工作方式几乎相同,但如果您更精通其中一个 - 没有理由更改它。至于它如何影响性能——无论是动态构造的视图还是查询——都是一样的。 View 在查询时只是一个巨大的帮助,如果你可以索引它,这意味着一些内存将花费在索引上。你必须测量
我现在认为物化视图是满足我的功能需求的方法,一旦我确认这一点,我可以设置一个触发器来刷新我表上的每个更新的物化视图:
-
REFRESH MATERIALIZED VIEW是如何工作的?它会删除数据并从头开始重新创建视图吗?还是会进行某种差异刷新?
【问题讨论】:
-
您使用的是哪个数据库
Mysql或Postgresql,并且您链接到的问题标有Sql Server。 -
我计划使用 postgresql,但我对 MySQL 等其他开源替代品持开放态度
-
我不是 Postgres 用户,但文档 here 正在展示如何创建该视图以及如何为其编制索引。如果您正在使用 Postgres 并且熟悉它 - 坚持下去。所有数据库的工作方式几乎相同,但如果您更精通其中一个 - 没有理由更改它。至于它如何影响性能——无论是动态构造的视图还是查询——都是一样的。 View 在查询时只是一个巨大的帮助,如果你可以索引它,这意味着一些内存将花费在索引上。你必须测量。
-
“计算列”在 MySQL 中相对“新”——您需要 MariaDB 10 或 MySQL 5.7。在 5.7.6 中,语法为
column GENERATED ALWAYS AS (expression) VIRTUAL | STORED。 -
@NB:我现在认为物化视图是满足我的功能需求的方法,一旦我确认这一点,我可以设置一个触发器来刷新我表上的每个更新的物化视图要点:
REFRESH MATERIALIZEDVIEW 是如何工作的?它会删除数据并从头开始重新创建视图吗?还是会进行某种差异刷新
标签: mysql sql performance postgresql database-performance