【问题标题】:Create constant string for entire database为整个数据库创建常量字符串
【发布时间】:2014-05-05 00:12:43
【问题描述】:

我还是 SQL 新手,所以我有一些小问题需要解决。 我在 Acqua Data Studio 中运行 Postgres 数据库,其中一些查询遵循相同的模型。
这些查询中的一些变量是相同的,但将来可能会改变......

考虑一个优化的数据库,更改常量的值比输入 20 多个查询并更改所有查询的相同方面要快。

例子:

SELECT *
FROM Table AS Default_Configs      
    LEFT JOIN Table AS Test_Configs
        ON Default_Configs.Column1 = 'BLABLABLA'

想象“BLABLABLA”可能是“XXX”,我怎样才能让“BLABLABLA”成为按照这种模式创建的每个视图的常量?

【问题讨论】:

标签: sql postgresql constants


【解决方案1】:

创建一个充当“全局常量”的小函数:

CREATE OR REPLACE FUNCTION f_my_constant()
  RETURNS text AS
$$SELECT text 'XXX'$$ LANGUAGE sql IMMUTABLE PARALLEL SAFE; -- see below

并在您的查询中使用该函数而不是 'BLABLABLA'

请务必正确声明数据类型并设置function IMMUTABLE(因为它是)以获得更好的大型查询性能。

在 Postgres 9.6 或更高版本中添加 PARALLEL SAFE,因此它不会阻止并行查询计划。该设置在旧版本中无效。

要更改常量,请通过运行更新的CREATE OR REPLACE FUNCTION 语句来替换函数。自动使用它使查询计划无效,因此重新计划查询。同时使用应该是安全的。更改后开始的事务使用新功能。但是涉及该函数的索引必须手动重建。


或者(特别是在 pg 9.2 或更高版本中),您可以将 Customized Option 设置为整个集群、给定数据库、给定角色等的“全局常量”,并通过以下方式检索值:

current_setting('constant.blabla')

一个限制:该值始终为text,并且可能必须转换为目标类型。

相关:

多种设置方式:

【讨论】:

  • 感谢您的信息!我只会使用 f_my_constant 而不是“BLABLABLA”?
  • @ZeldaElf f_my_constant(),包括括号。
  • 我刚刚编写了一个微基准测试来测试不可变函数和单行/单列表之间的性能差异——我很惊讶该表在多次运行中都优于该函数。我希望在 SO 将其写成一个问题,但我会提醒大家不要接受公认的智慧。对于函数,您还必须使用 DDL 而不是 DML 更改值,这会产生一些负面影响。
  • 一切真实,意料之中。与从单例表中读取值相比,函数的开销更大。但是,差异很小,尤其是在函数可以内联的情况下。从 Postgres 9.2 开始,自定义选项将是另一个不错的选择。我在上面添加了指针。
猜你喜欢
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 2014-09-14
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多