我对 SQL 还很陌生,所以我有一些小问题需要解决。
我正在 Acqua Data Studio 中运行 Postgres 数据库,其中一些查询遵循相同的模型。
这些查询中的一些变量是相同的,但将来可能会发生变化......
考虑一个优化的数据库,更改常量的值比输入 20 多个查询并在所有查询中更改相同的方面要更快。
Example:
SELECT *
FROM Table AS Default_Configs
LEFT JOIN Table AS Test_Configs
ON Default_Configs.Column1 = 'BLABLABLA'
想象“BLABLABLA”可能是“XXX”,我如何才能使“BLABLABLA”成为按照此模式创建的每个视图的常量?
创建一个充当“全局常量”的小函数:
CREATE OR REPLACE FUNCTION f_my_constant()
RETURNS text AS
$$SELECT text 'XXX'$$ LANGUAGE sql IMMUTABLE PARALLEL SAFE; -- see below
并使用该函数而不是'BLABLABLA'
在您的查询中。
确保正确声明数据类型并进行功能IMMUTABLE https://www.postgresql.org/docs/current/sql-createfunction.html(因为确实如此)为了更好地处理大查询。
在 Postgres 9.6 或更高版本中添加PARALLEL SAFE
,因此它不会阻止并行查询计划。该设置在旧版本中无效。
要更改常量,请通过运行更新的函数来替换该函数CREATE OR REPLACE FUNCTION
陈述。自动使用它使查询计划失效,因此重新计划查询。并发使用应该是安全的。更改后开始的交易使用新功能。但涉及该函数的索引必须手动重建。
或者(特别是在 9.2 或更高版本中),您可以设置定制选项 https://www.postgresql.org/docs/current/runtime-config-custom.html作为整个集群、给定数据库、给定角色等的“全局常量”,并使用以下命令检索值:
current_setting('constant.blabla')
一个限制:该值始终是text
并且可能必须转换为目标类型。
Related:
- PostgreSQL 中的用户定义变量 https://stackoverflow.com/questions/14261035/user-defined-variables-in-postgresql/14261927#14261927
设置方法有多种:
- search_path 如何影响标识符解析和“当前模式” https://stackoverflow.com/questions/9067335/how-does-the-search-path-influence-identifier-resolution-and-the-current-schema/9067777#9067777
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)