Useful PostgreSQL Queries
From Observer GigaFlow Support | VIAVI Solutions Inc.
Finding the largest tables
SELECT nspname || '.' || relname AS "relation", pg_size_pretty(pg_relation_size(C.oid)) AS "size" FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE nspname NOT IN ('pg_catalog', 'information_schema') ORDER BY pg_relation_size(C.oid) DESC LIMIT 20;
Empty tables
SELECT nspname || '.' || relname AS "relation", pg_size_pretty(pg_relation_size(C.oid)) AS "size" FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE nspname NOT IN ('pg_catalog', 'information_schema') and relname like 'netflow_____%' and pg_relation_size(C.oid)=0 ORDER BY pg_relation_size(C.oid) asc;
8.4 fixes
CREATE FUNCTION modulus( dividend numeric, divisor numeric) RETURNS numeric AS ' DECLARE result numeric; temp numeric; BEGIN temp := ABS(divisor);result := MOD(dividend, temp);IF result < 0 THEN result := result + temp; END IF; RETURN result;END;' LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION modulus(numeric, numeric) OWNER TO myipfix; CREATE FUNCTION modulus( dividend numeric, divisor integer) RETURNS numeric AS ' DECLARE result numeric; temp numeric; BEGIN temp := ABS(divisor);result := MOD(dividend, temp);IF result < 0 THEN result := result + temp; END IF; RETURN result;END;' LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION modulus(numeric, numeric) OWNER TO myipfix;
Foogun to remove tables en-mas e.g. select foogun('public','flowsec_151'); will remove all tables starting with flowsec_151. Select netflow\_0\_5\_%\_150%\_ whill delete all netflow in the 150 time period
CREATE OR REPLACE FUNCTION foogun(IN _schema TEXT, IN _parttionbase TEXT) RETURNS void LANGUAGE plpgsql AS $$ DECLARE row record; BEGIN FOR row IN SELECT table_schema, table_name FROM information_schema.tables WHERE table_type = 'BASE TABLE' AND table_schema = _schema AND table_name ILIKE (_parttionbase || '%') LOOP EXECUTE 'DROP TABLE ' || quote_ident(row.table_schema) || '.' || quote_ident(row.table_name); RAISE INFO 'Dropped table: %', quote_ident(row.table_schema) || '.' || quote_ident(row.table_name); END LOOP; END; $$;
Delete old indexes
CREATE OR REPLACE FUNCTION foogunindex( IN _parttionbase TEXT) RETURNS void LANGUAGE plpgsql AS $$ DECLARE row record; BEGIN FOR row IN SELECT indexname from pg_indexes WHERE indexname ILIKE ( _parttionbase||'%' ) and tablename like 'netflow_0_%' LOOP EXECUTE 'DROP INDEX ' || quote_ident(row.indexname ); RAISE INFO 'Dropped INDEX %', quote_ident(row.indexname ); END LOOP; END; $$; select foogunindex('appid_0_%_%_86400000'); select foogunindex('srcport_0_%_%_86400000'); select foogunindex('dstport_0_%_%_86400000'); select foogunindex('srcport_0_%_%_86400000');
Find indexes
select ||a.aname|| from (SELECT n.nspname as "Schema", c.relname as "aname", CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' END as "Type", u.usename as "Owner", c2.relname as "Table" FROM pg_catalog.pg_class c JOIN pg_catalog.pg_index i ON i.indexrelid = c.oid JOIN pg_catalog.pg_class c2 ON i.indrelid = c2.oid LEFT JOIN pg_catalog.pg_user u ON u.usesysid = c.relowner LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind IN ('i',) AND n.nspname NOT IN ('pg_catalog', 'pg_toast') AND pg_catalog.pg_table_is_visible(c.oid) and c.relname like 'appid_0_5_%' ORDER BY 1,2)as a;
Check table inheritance
SELECT pg_inherits.*, c.relname AS child, p.relname AS parent FROM pg_inherits JOIN pg_class AS c ON (inhrelid=c.oid) JOIN pg_class as p ON (inhparent=p.oid) where p.relname like 'fdw%';
Count number of user events in last 7 days
select userid,count(*) as eventCount, source as sourceips from userevents where firstseen > gettimeimmutable('7 days') group by userid,sourceips
Count number of user logins in last 7 days
select userid,count(*) as eventCount, source as sourceips from userevents where firstseen > gettimeimmutable('7 days') and params like '%action\":[\"login\"]%' group by userid,sourceips
Find all uplinks
select ip,display,sysname,anifindex,name,alias,maccount,descr from (select * from (select devices.ip,devices.display,devices.sysname,cams.device as deviceid,cams.ifindex as anifindex,count(distinct (mac)) as maccount from cams full outer join devices on devices.device=cams.device where firstseen>gettimeimmutable('10 day') group by cams.device,cams.ifindex,devices.ip,devices.display,devices.sysname order by maccount desc) as a full outer join deviceinterfaces on deviceinterfaces.device=a.deviceid and a.anifindex=deviceinterfaces.ifindex )as fulllist where maccount >1 order by maccount desc