【问题标题】:Saved View with a timestamp expression带有时间戳表达式的已保存视图
【发布时间】:2021-02-01 16:24:42
【问题描述】:

在使用时间戳/电压表达式的保存视图中如何表示数据是否有标准?例如,假设我有 SQL 查询:

SELECT person_id, name, NOW() as now FROM table

NOW() 函数每次运行时都会有不同的值。将上述内容保存到视图时,数据是否存储为:

person_id          name             now
1                  Bob              2020-01-01T01:01:01
2                  Billy            2020-01-01T01:01:01
3                  Barbara          2020-01-01T01:01:01

还是存储为:

person_id          name             now
1                  Bob              =NOW()
2                  Billy            =NOW()
3                  Barbara          =NOW()

还是依赖于数据库实现,没有标准?

【问题讨论】:

  • 一个视图没有被“保存”,它只是一个选择。你为什么不简单地尝试一下?
  • @dnoeth 是的,我尝试了一个表和一个视图,该表被永久存储,视图是按需计算的。那么物化视图呢?
  • 您使用的是哪个 dbms?
  • @jarlh 对我来说这更像是一个概念性问题,但为了测试它我使用的是 mysql(它没有物化视图)
  • 您存储值,例如表中的时间戳(使用 INSERT/UPDATE)。当您选择时,您将获得存储的值。您还可以选择一个函数(例如 NOW()),您将获得当前时间戳。视图只是一个预定义的选择。物化视图是一种优化技巧,其中准备和存储视图选择以便更快地访问 - 但您仍将获得作为选择的结果。

标签: sql


【解决方案1】:

Now() 只是一个函数,将在插入时运行。

所以结果是

person_id          name             now
1                  Bob              2020-01-01 01:01:01
2                  Billy            2020-01-01 01:01:01
3                  Barbara          2020-01-01 01:01:01

【讨论】:

  • 我明白了,那么now() 函数是如何存储的呢?而且我假设一个视图与CREATE TABLE AS... 不同,其中值被永久存储?
  • 它是内置的,但您可以通过插件添加自己的功能
【解决方案2】:

我知道这会产生误导。但是,视图不会“存储”数据(物化视图除外,它们是不同的存储)。

视图是一个查询,它替换到使用它的查询中。诚然,它可以被提前解析,省了一点力气。

但是,当查询执行时,会调用诸如now() 之类的函数。因此,您将看到的值是运行查询时的值。

这实际上是一个混乱,因为函数now() 不是为每一行调用。相反,它在查询开始执行时被评估一次。但是,有问题的查询是使用视图的查询,而不是创建视图的命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    相关资源
    最近更新 更多