如何获取 postgresql 本地配置参数的当前值?

问题描述 投票:0回答:2

我正在练习查询优化。特别是调整 work_mem 参数。

有数据库图:https://postgrespro.com/docs/postgrespro/12/apks02.

我有一个sql函数get_passengers_and_flights

CREATE FUNCTION get_passengers_and_flights(d timestamptz)
RETURNS TABLE(passenger_name text, flight_no text)
AS $$
  SELECT t.passenger_name, f.flight_no
  FROM tickets t
    JOIN ticket_flights tf ON tf.ticket_no = t.ticket_no
    JOIN flights f ON f.flight_id = tf.flight_id
  WHERE f.scheduled_departure >= date_trunc('month', d)
    AND f.scheduled_departure  < date_trunc('month', d) + interval '1 month'
  ORDER BY f.scheduled_departure, t.passenger_name;
$$ LANGUAGE sql;

还有一个简单的查询:

SELECT * FROM get_passengers_and_flights('2017-06-01') LIMIT 3;

默认情况下workmem = '4MB',所以排序需要一些时间。使 work_mem 从“4MB”增加到“32MB”或更多的更好方法之一。在最新版本的 postgresql 中,我们可以在本地执行(对于函数、表等):

ALTER FUNCTION get_passengers_and_flights SET work_mem = '32MB';

因此,选择了 quicksort 并且执行时间减少了。

但问题是我如何才能看到 work_mem get_passengers_and_flights 函数的局部值?

获得work_mem值的明显方法是:

SELECT current_setting('work_mem');

输出的是全局值'4MB',那么如何获取本地值'32MB'呢?我浏览了系统目录描述,但一无所获。

sql database postgresql optimization database-administration
2个回答
1
投票

以下查询应给出所需的结果:

SELECT
  REGEXP_SUBSTR(c.setting, '[^=]+$') AS work_mem
FROM
  pg_proc
  CROSS JOIN unnest(pg_proc.proconfig) c(setting)
WHERE
  proname = 'get_passengers_and_flights'
  AND c.setting LIKE 'work_mem=%';

如果 work_mem 尚未在本地为函数配置,则返回 NULL。


0
投票

如果您只想查看已创建函数的属性,请使用专用的系统信息函数

pg_get_functiondef()

SELECT pg_get_functiondef('public.get_passengers_and_flights(timestamptz)'::regprocedure);

这可靠地获取函数 OID - 假设它是在模式中创建的

public

'public.get_passengers_and_flights(timestamptz)'::regprocedure

参见:

© www.soinside.com 2019 - 2024. All rights reserved.