1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
CREATE PROCEDURE @extschema@.run_analyze(p_skip_locked boolean DEFAULT false, p_quiet boolean DEFAULT false, p_parent_table text DEFAULT NULL)
LANGUAGE plpgsql
AS $$
DECLARE
v_adv_lock boolean;
v_parent_schema text;
v_parent_tablename text;
v_row record;
v_sql text;
BEGIN
v_adv_lock := pg_try_advisory_lock(hashtext('pg_partman run_analyze'));
IF v_adv_lock = false THEN
RAISE NOTICE 'Partman analyze already running or another session has not released its advisory lock.';
RETURN;
END IF;
FOR v_row IN SELECT parent_table FROM @extschema@.part_config
LOOP
IF p_parent_table IS NOT NULL THEN
IF p_parent_table != v_row.parent_table THEN
CONTINUE;
END IF;
END IF;
SELECT n.nspname, c.relname
INTO v_parent_schema, v_parent_tablename
FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid
WHERE n.nspname = split_part(v_row.parent_table, '.', 1)::name
AND c.relname = split_part(v_row.parent_table, '.', 2)::name;
v_sql := 'ANALYZE ';
IF p_skip_locked THEN
v_sql := v_sql || 'SKIP LOCKED ';
END IF;
v_sql := format('%s %I.%I', v_sql, v_parent_schema, v_parent_tablename);
IF p_quiet = 'false' THEN
RAISE NOTICE 'Analyzed partitioned table: %.%', v_parent_schema, v_parent_tablename;
END IF;
EXECUTE v_sql;
COMMIT;
END LOOP;
PERFORM pg_advisory_unlock(hashtext('pg_partman run_analyze'));
END
$$;
|