【问题标题】:SQL update scalar functionSQL 更新标量函数
【发布时间】:2014-04-24 16:33:21
【问题描述】:

当我运行这个查询时:

UPDATE myTable SET x = (SELECT round(random()*100));

所有记录都具有相同的 x 值。这是有道理的。

当我运行这个查询时:

UPDATE myTable SET x = round(random()*100);

它会更新表中的所有记录,并且对于每条记录,x 的值是不同的。

我想知道第二个查询在后台发生了什么。是否为每个记录 id(1....n) 运行更新查询?

我猜它的工作原理类似于触发器,更新前的每一行

  1. 触发器拦截
  2. 调用函数并设置x的值
  3. 执行查询

实际发生了什么?

【问题讨论】:

    标签: sql postgresql random sql-update sql-execution-plan


    【解决方案1】:

    其实很简单。函数random() 定义为VOLATILE

    如果将其放入子查询中,则会生成包含单行的派生表。 Postgres 可以将结果具体化并在外部查询中多次重复使用。

    否则 Postgres 会为每一行调用该函数。这就是必须处理VOLATILE 函数的方式。 Per documentation on function volatility:

    VOLATILE 函数可以做任何事情,包括修改数据库。 它可以在相同的连续调用中返回不同的结果 论据。优化器不对 这样的功能。 使用 volatile 函数的查询将重新评估 在需要其值的每一行上都起作用。

    我的大胆强调。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-17
      相关资源
      最近更新 更多