I need help optimizing this function as it takes more than 2 minutes currently which is far from optimal. This function basically gives you the name of column, corresponding table and list of unique values contained in the column.
Function Definition:
CREATE OR REPLACE FUNCTION get_pubcol(
included_tables name[] default '{}',
included_schema name[] default '{}'
)
RETURNS table(schema_name text, table_name text, column_name text, column_value text)
AS $$
begin
FOR schema_name, table_name, column_name IN
SELECT c.table_schema, c.table_name, c.column_name
FROM information_schema.columns c
JOIN information_schema.tables t ON
(t.table_name = c.table_name AND t.table_schema=c.table_schema)
WHERE (c.table_name=ANY(included_tables) OR included_tables='{}')
AND (c.table_schema=ANY(included_schema) OR included_schema='{}')
AND t.table_type='BASE TABLE'
LOOP
EXECUTE format('SELECT ARRAY_AGG(DISTINCT %I) AS column_value FROM %I.%I',
column_name,
schema_name,
table_name
) INTO column_value;
IF column_value is not null THEN
RETURN NEXT;
END IF;
END LOOP;
END;
$$ language plpgsql;
Function call:
SELECT * FROM get_pubcol('{}', '{public}')
Explain Analyze Result:
"Function Scan on get_pubcol (cost=0.25..10.25 rows=1000 width=128) (actual time=121235.178..121235.199 rows=73 loops=1)"
"Planning time: 0.049 ms"
"Execution time: 121237.436 ms"
Query Result:
schema_name table_name column_name column_value
"public" "MARA" "Lab/Office" "{" ",BL1,GL1,GP1,KL1,KP1,NaN,SL1,SP1,WL1,WL2,WP1}"