对于幂等数据修改函数,STABLE波动是否安全?

时间:2017-01-16 12:19:50

标签: postgresql

我有一个更新数据(update_data)的PL / pgSQL函数。在事务的上下文中,该函数可以被认为是幂等的,即,如果在同一事务中使用相同的参数调用该函数,则将以完全相同的方式修改数据。该函数实际上是多个upserts的包装器。以下是我的用例的简要版本:

CREATE FUNCTION top_level() RETURNS void AS $func$
BEGIN
  -- ...
  SELECT update_data(a => p_a, b => p_b) INTO v_a, v_b, v_c;
  PERFORM nested_one_level(/* ... */);
  -- ...
END
$func$ LANGUAGE plpgsql;

CREATE FUNCTION nested_one_level() RETURNS void AS $func$
BEGIN
  -- ...
  SELECT update_data(a => p_a, b => p_b) INTO v_a, v_b;
  PERFORM nested_two_levels(/* ... */);
  -- ...
END
$func$ LANGUAGE plpgsql;

CREATE FUNCTION nested_two_levels() RETURNS void AS $func$
BEGIN
  -- ...
  SELECT update_data(a => p_a, b => p_b) INTO v_a;
  -- ...
END
$func$ LANGUAGE plpgsql;

请注意,在事务中,将始终使用相同的参数调用函数。但是,我使用了不同的INTO条款。

多次调用update_data函数的原因是某些嵌套函数可以通过其他RESTful路由独立使用。

据我所知,将update_data的波动率水平设为STABLE意味着(a)我们获得了潜在的绩效奖励,并且(b)我们避免必须缓存结果update_data并传递它以便不再调用它,例如

IF p_update_data_results IS NOT NULL THEN
  SELECT update_data(a => p_a, b => p_b) INTO v_a, v_b, v_c;
END IF;

由于docs

中的以下内容,我只是犹豫不决
  

任何带有副作用的功能必须标记为VOLATILE,以便无法优化对它的调用。

但我会假设,如果在同一事务中给定相同参数的副作用保证相同,那么使用STABLE是否安全?

我使用Postgres 9.5.4

0 个答案:

没有答案