
前言
前些天,有同学问:PG里支持类似于MySQL中的show variable like '%abc%'这样的查询吗?尤其是配置文件中的选项之类的。
这个怎么说呢,配置文件中的参数值,到PostgreSQL15,确实是支持的,使用起来也蛮方便的。如:
postgres=# \dconfig '*cost*'
List of configuration parameters
Parameter | Value
------------------------------+--------
autovacuum_vacuum_cost_delay | 2ms
autovacuum_vacuum_cost_limit | -1
cpu_index_tuple_cost | 0.005
cpu_operator_cost | 0.0025
cpu_tuple_cost | 0.01
jit_above_cost | 100000
jit_inline_above_cost | 500000
jit_optimize_above_cost | 500000
parallel_setup_cost | 1000
parallel_tuple_cost | 0.1
random_page_cost | 4
seq_page_cost | 1
vacuum_cost_delay | 0
vacuum_cost_limit | 200
vacuum_cost_page_dirty | 20
vacuum_cost_page_hit | 1
vacuum_cost_page_miss | 2
(17 rows)
但是在14以及以前的老版本,是没有这个功能的。上边的模糊匹配采用的是"*",不是"%"匹配符。
我突然想起,咱们能不能直接模仿别的数据库,来造个函数select sp_configure ('cost'),就能得到上边的结果呢?这样不就可以算是替代解决了这个问题了吗?以前在别的数据库中偶尔也这么干过。
替代解决方法
我们可以仔细比较上边的PG15中用到的元命令\dconfig 与下边的查询实质上是一样的:
具体的SQL语句是:select name, setting from pg_settings where name ~ 'cost';
postgres=# select name, setting from pg_settings where name ~ 'cost';
name | setting
------------------------------+---------
autovacuum_vacuum_cost_delay | 2
autovacuum_vacuum_cost_limit | -1
cpu_index_tuple_cost | 0.005
cpu_operator_cost | 0.0025
cpu_tuple_cost | 0.01
jit_above_cost | 100000
jit_inline_above_cost | 500000
jit_optimize_above_cost | 500000
parallel_setup_cost | 1000
parallel_tuple_cost | 0.1
random_page_cost | 4
seq_page_cost | 1
vacuum_cost_delay | 0
vacuum_cost_limit | 200
vacuum_cost_page_dirty | 20
vacuum_cost_page_hit | 1
vacuum_cost_page_miss | 2
(17 rows)
基于这个,我们造一个函数看看:
drop function if exists sp_configure(str text);
create or replace function sp_configure(str text)
returns table (name text, setting text)
language plpgsql as $$
begin
return query
select s.name, s.setting from pg_settings AS s where s.name ~ str;
-- return next;
end $$;
看看效果:
postgres=# select * from sp_configure('cost');
name | setting
------------------------------+---------
autovacuum_vacuum_cost_delay | 2
autovacuum_vacuum_cost_limit | -1
cpu_index_tuple_cost | 0.005
cpu_operator_cost | 0.0025
cpu_tuple_cost | 0.01
jit_above_cost | 100000
jit_inline_above_cost | 500000
jit_optimize_above_cost | 500000
parallel_setup_cost | 1000
parallel_tuple_cost | 0.1
random_page_cost | 4
seq_page_cost | 1
vacuum_cost_delay | 0
vacuum_cost_limit | 200
vacuum_cost_page_dirty | 20
vacuum_cost_page_hit | 1
vacuum_cost_page_miss | 2
(17 rows)
postgres=# select sp_configure('cost');
sp_configure
-----------------------------------
(autovacuum_vacuum_cost_delay,2)
(autovacuum_vacuum_cost_limit,-1)
(cpu_index_tuple_cost,0.005)
(cpu_operator_cost,0.0025)
(cpu_tuple_cost,0.01)
(jit_above_cost,100000)
(jit_inline_above_cost,500000)
(jit_optimize_above_cost,500000)
(parallel_setup_cost,1000)
(parallel_tuple_cost,0.1)
(random_page_cost,4)
(seq_page_cost,1)
(vacuum_cost_delay,0)
(vacuum_cost_limit,200)
(vacuum_cost_page_dirty,20)
(vacuum_cost_page_hit,1)
(vacuum_cost_page_miss,2)
(17 rows)
postgres=# select * from sp_configure('ccc');
name | setting
------+---------
(0 rows)
看来还可以拿来使用。对于低版本的,可以用这个sp_configure('<option\>')来代替使用了。
参考:
1、How can I return multiple rows of records in PL/pgSQL
https://dba.stackexchange.com/questions/186257/how-can-i-return-multiple-rows-of-records-in-pl-pgsql

文章转载自数据库杂记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




