暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL配置项支持模糊查询不?你可以的

数据库杂记 2023-04-10
43

前言

前些天,有同学问: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

2、PostgreSQL SQL的基础使用及技巧



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

评论