在Postgres中,检索会话级别设置的一种更高性能的方式



在Postgres中,以下命令将返回一个设置值:

SELECT current_setting('foo');

如果该设置不存在,它将引发异常。

我们有一个设置可能存在也可能不存在的情况,所以我们不得不创建一个函数来捕获异常并返回null:

CREATE OR REPLACE FUNCTION public.get_foo() 
RETURNS varchar 
LANGUAGE plpgsql AS $$
BEGIN
RETURN (SELECT current_setting('foo'));
EXCEPTION 
WHEN others THEN
RETURN NULL;
END;
$$;

然而,当设置不存在时,这种情况会非常糟糕,可能是因为抛出和捕获异常的成本很高。

有没有办法检查设置是否存在?

实际上有两个名为current_setting的函数。您使用的第一个接受一个表示变量名的string。另一个接受两个参数,一个是用于变量名的string,另一个是指示缺少的变量名是否正常的boolean

只需使用SELECT coalesce(current_setting('my.foo', true), 'mydefault');

示例:

postgres=> set session my.foo to 'baz';
SET
postgres=> select current_setting('public.foo', true);
current_setting 
-----------------
baz
(1 row)
postgres=> select current_setting('public.bar', true);
current_setting 
-----------------

(1 row)
postgres=> select coalesce(current_setting('public.bar', true), 'mydefault');
coalesce  
-----------
mydefault
(1 row)

尝试使用此系统视图,而不是current_setting函数。

SELECT setting FROM pg_catalog.pg_settings WHERE name = 'foo';

另一个";奖金";你可以把它用作一个常规表格:

(filip@[local]:5432) filip=# SELECT name, setting, unit, source, boot_val FROM pg_settings WHERE name ~ 'mem';
name            | setting | unit |       source       | boot_val 
----------------------------+---------+------+--------------------+----------
autovacuum_work_mem        | -1      | kB   | default            | -1
dynamic_shared_memory_type | posix   | NULL | configuration file | posix
hash_mem_multiplier        | 1       | NULL | default            | 1
logical_decoding_work_mem  | 65536   | kB   | default            | 65536
maintenance_work_mem       | 512000  | kB   | session            | 65536
shared_memory_type         | mmap    | NULL | default            | mmap
work_mem                   | 20480   | kB   | session            | 4096
(7 rows)

(filip@[local]:5432) filip=# SELECT source, count(*) FROM pg_settings GROUP BY 1;
source        | count 
----------------------+-------
client               |     2
environment variable |     1
configuration file   |    26
default              |   291
session              |     2
override             |    13
(6 rows)

最新更新