我正在练习查询优化。特别是调整 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'呢?我浏览了系统目录描述,但一无所获。
以下查询应给出所需的结果:
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。
pg_get_functiondef()
:
SELECT pg_get_functiondef('public.get_passengers_and_flights(timestamptz)'::regprocedure);
这可靠地获取函数 OID - 假设它是在模式中创建的
public
:
'public.get_passengers_and_flights(timestamptz)'::regprocedure
参见: