我对 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”成为按照此模式创建的每个 View 的常量?
最佳答案
创建一个用作“全局常量”的小函数:
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
并且可能必须转换为目标类型。
相关:
多种设置方式:
关于sql - 为整个数据库创建常量字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22663599/