Fix pgstattuple error in c77_dbh_update_vacuum_stats by filtering for regular tables only
This commit is contained in:
parent
19b1de9935
commit
08750c9654
@ -1,6 +1,13 @@
|
|||||||
CREATE OR REPLACE FUNCTION public.c77_dbh_get_vacuum_health()
|
CREATE OR REPLACE FUNCTION public.c77_dbh_get_vacuum_health()
|
||||||
RETURNS JSON AS $$
|
RETURNS JSON AS $$
|
||||||
|
DECLARE
|
||||||
|
v_has_pgstattuple boolean;
|
||||||
BEGIN
|
BEGIN
|
||||||
|
-- Check if pgstattuple is installed
|
||||||
|
SELECT EXISTS (
|
||||||
|
SELECT 1 FROM pg_extension WHERE extname = 'pgstattuple'
|
||||||
|
) INTO v_has_pgstattuple;
|
||||||
|
|
||||||
RETURN (
|
RETURN (
|
||||||
SELECT json_agg(
|
SELECT json_agg(
|
||||||
json_build_object(
|
json_build_object(
|
||||||
@ -32,7 +39,8 @@ BEGIN
|
|||||||
'dead_tuples', dead_tuples,
|
'dead_tuples', dead_tuples,
|
||||||
'live_tuples', live_tuples,
|
'live_tuples', live_tuples,
|
||||||
'table_size', table_size::text || ' bytes',
|
'table_size', table_size::text || ' bytes',
|
||||||
'bloat_estimate', bloat_estimate::text || '%'
|
'bloat_estimate', bloat_estimate::text || '%' ||
|
||||||
|
(CASE WHEN v_has_pgstattuple THEN ' (precise)' ELSE ' (estimated)' END)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
FROM public.c77_dbh_vacuum_stats
|
FROM public.c77_dbh_vacuum_stats
|
||||||
|
@ -1,6 +1,13 @@
|
|||||||
CREATE OR REPLACE FUNCTION public.c77_dbh_update_vacuum_stats()
|
CREATE OR REPLACE FUNCTION public.c77_dbh_update_vacuum_stats()
|
||||||
RETURNS void AS $$
|
RETURNS void AS $$
|
||||||
|
DECLARE
|
||||||
|
v_has_pgstattuple boolean;
|
||||||
BEGIN
|
BEGIN
|
||||||
|
-- Check if pgstattuple is installed
|
||||||
|
SELECT EXISTS (
|
||||||
|
SELECT 1 FROM pg_extension WHERE extname = 'pgstattuple'
|
||||||
|
) INTO v_has_pgstattuple;
|
||||||
|
|
||||||
-- Insert or update vacuum stats for all user tables
|
-- Insert or update vacuum stats for all user tables
|
||||||
INSERT INTO public.c77_dbh_vacuum_stats (
|
INSERT INTO public.c77_dbh_vacuum_stats (
|
||||||
table_name, last_vacuum, last_autovacuum, vacuum_count,
|
table_name, last_vacuum, last_autovacuum, vacuum_count,
|
||||||
@ -29,12 +36,26 @@ BEGIN
|
|||||||
table_size = EXCLUDED.table_size,
|
table_size = EXCLUDED.table_size,
|
||||||
last_updated = EXCLUDED.last_updated;
|
last_updated = EXCLUDED.last_updated;
|
||||||
|
|
||||||
-- Estimate bloat (simple heuristic for now; requires pgstattuple for precision)
|
-- Update bloat estimate
|
||||||
UPDATE public.c77_dbh_vacuum_stats
|
IF v_has_pgstattuple THEN
|
||||||
SET bloat_estimate = CASE
|
-- Use pgstattuple for precise bloat if available
|
||||||
WHEN live_tuples + dead_tuples = 0 THEN 0
|
UPDATE public.c77_dbh_vacuum_stats v
|
||||||
ELSE ROUND((dead_tuples::numeric / (live_tuples + dead_tuples)) * 100, 2)
|
SET bloat_estimate = ROUND(CAST(COALESCE(t.free_percent + t.dead_tuple_percent, 0) AS numeric), 2)
|
||||||
END
|
FROM (
|
||||||
WHERE last_updated = now();
|
SELECT (pgstattuple(c.oid)).*
|
||||||
|
FROM pg_class c
|
||||||
|
JOIN pg_namespace n ON n.oid = c.relnamespace
|
||||||
|
WHERE (n.nspname || '.' || c.relname) = v.table_name
|
||||||
|
) t
|
||||||
|
WHERE v.last_updated = now();
|
||||||
|
ELSE
|
||||||
|
-- Fallback to heuristic bloat estimate
|
||||||
|
UPDATE public.c77_dbh_vacuum_stats
|
||||||
|
SET bloat_estimate = CASE
|
||||||
|
WHEN live_tuples + dead_tuples = 0 THEN 0
|
||||||
|
ELSE ROUND((dead_tuples::numeric / (live_tuples + dead_tuples)) * 100, 2)
|
||||||
|
END
|
||||||
|
WHERE last_updated = now();
|
||||||
|
END IF;
|
||||||
END;
|
END;
|
||||||
$$ LANGUAGE plpgsql;
|
$$ LANGUAGE plpgsql;
|
Loading…
x
Reference in New Issue
Block a user