Skip to content

Commit

Permalink
Remove outdated index suggestion queries.
Browse files Browse the repository at this point in the history
Those queries are too naive, and will be replaced by a better approach in a
following commit.
  • Loading branch information
rjuju committed Dec 29, 2019
1 parent eb7d582 commit 6619c10
Showing 1 changed file with 0 additions and 87 deletions.
87 changes: 0 additions & 87 deletions pg_qualstats--2.0.0dev.sql
Original file line number Diff line number Diff line change
Expand Up @@ -378,90 +378,3 @@ CREATE OR REPLACE VIEW pg_qualstats_by_query AS
WHERE (qs.lrelid IS NULL) != (qs.rrelid IS NULL)
) i GROUP BY coalesce(uniquequalid, uniquequalnodeid), coalesce(qualid, qualnodeid), dbid, userid, occurences, execution_count, nbfiltered, queryid
;


CREATE VIEW pg_qualstats_indexes AS
SELECT relid::regclass, attnames, possible_types, sum(execution_count) as execution_count
FROM (
SELECT qs.relid::regclass, array_agg(distinct attnames) as attnames, array_agg(distinct amname) as possible_types, max(execution_count) as execution_count, array_agg(distinct attnum) as attnums
FROM pg_qualstats_all as qs
INNER JOIN pg_amop amop ON amop.amopopr = opno
INNER JOIN pg_am on amop.amopmethod = pg_am.oid,
LATERAL (SELECT attname as attnames from pg_attribute inner join unnest(attnums) a on a = attnum and attrelid = qs.relid order by attnum) as attnames,
LATERAL unnest(attnums) as attnum
WHERE NOT EXISTS (
SELECT 1 from pg_index i
WHERE indrelid = relid AND (
arraycontains((i.indkey::int[])[0:array_length(attnums, 1) - 1], (attnums::int[])) OR
(arraycontains((attnums::int[]),(i.indkey::int[])[0:array_length(indkey, 1) + 1]) AND
i.indisunique))
)
GROUP BY qs.relid, qualnodeid
) t GROUP BY relid, attnames, possible_types;



CREATE OR REPLACE FUNCTION pg_qualstats_suggest_indexes(relid oid, attnums integer[], opno oid) RETURNS TABLE(index_ddl text) AS $$
BEGIN
RETURN QUERY
SELECT 'CREATE INDEX idx_' || q.relid || '_' || array_to_string(attnames, '_') || ' ON ' || nspname || '.' || q.relid || ' USING ' || idxtype || ' (' || array_to_string(attnames, ', ') || ')' AS index_ddl
FROM (SELECT t.nspname,
t.relid,
t.attnames,
unnest(t.possible_types) AS idxtype

FROM ( SELECT nl.nspname AS nspname,
qs.relid::regclass AS relid,
array_agg(DISTINCT attnames.attnames) AS attnames,
array_agg(DISTINCT pg_am.amname) AS possible_types,
array_agg(DISTINCT attnum.attnum) AS attnums
FROM (VALUES (relid, attnums::int[], opno)) as qs(relid, attnums, opno)
LEFT JOIN (pg_class cl JOIN pg_namespace nl ON nl.oid = cl.relnamespace) ON cl.oid = qs.relid
JOIN pg_am amop ON amop.amopopr = qs.opno
JOIN pg_am ON amop.amopmethod = pg_am.oid AND pg_am.amname <> 'hash',
LATERAL ( SELECT pg_attribute.attname AS attnames
FROM pg_attribute
JOIN unnest(qs.attnums) a(a) ON a.a = pg_attribute.attnum AND pg_attribute.attrelid = qs.relid
ORDER BY pg_attribute.attnum) attnames,
LATERAL unnest(qs.attnums) attnum(attnum)
WHERE NOT (EXISTS ( SELECT 1
FROM pg_index i
WHERE i.indrelid = qs.relid AND (arraycontains((i.indkey::int[])[0:array_length(qs.attnums, 1) - 1], qs.attnums::int[]) OR arraycontains(qs.attnums::int[], (i.indkey::int[])[0:array_length(i.indkey, 1) + 1]) AND i.indisunique)))
GROUP BY nl.nspname, qs.relid) t
GROUP BY t.nspname, t.relid, t.attnames, t.possible_types) q;
END;
$$ language plpgsql;

CREATE OR REPLACE VIEW pg_qualstats_indexes_ddl AS
SELECT q.nspname,
q.relid,
q.attnames,
q.idxtype,
q.execution_count,
'CREATE INDEX idx_' || relid || '_' || array_to_string(attnames, '_') || ' ON ' || nspname || '.' || relid || ' USING ' || idxtype || ' (' || array_to_string(attnames, ', ') || ')' AS ddl
FROM (SELECT t.nspname,
t.relid,
t.attnames,
unnest(t.possible_types) AS idxtype,
sum(t.execution_count) AS execution_count

FROM ( SELECT nl.nspname AS nspname,
qs.relid::regclass AS relid,
array_agg(DISTINCT attnames.attnames) AS attnames,
array_agg(DISTINCT pg_am.amname) AS possible_types,
max(qs.execution_count) AS execution_count,
array_agg(DISTINCT attnum.attnum) AS attnums
FROM pg_qualstats_all qs
LEFT JOIN (pg_class cl JOIN pg_namespace nl ON nl.oid = cl.relnamespace) ON cl.oid = qs.relid
JOIN pg_amop amop ON amop.amopopr = qs.opno
JOIN pg_am ON amop.amopmethod = pg_am.oid,
LATERAL ( SELECT pg_attribute.attname AS attnames
FROM pg_attribute
JOIN unnest(qs.attnums) a(a) ON a.a = pg_attribute.attnum AND pg_attribute.attrelid = qs.relid
ORDER BY pg_attribute.attnum) attnames,
LATERAL unnest(qs.attnums) attnum(attnum)
WHERE NOT (EXISTS ( SELECT 1
FROM pg_index i
WHERE i.indrelid = qs.relid AND (arraycontains((i.indkey::int[])[0:array_length(qs.attnums, 1) - 1], qs.attnums::int[]) OR arraycontains(qs.attnums::int[], (i.indkey::int[])[0:array_length(i.indkey, 1) + 1]) AND i.indisunique)))
GROUP BY nl.nspname, qs.relid, qs.qualnodeid) t
GROUP BY t.nspname, t.relid, t.attnames, t.possible_types) q;

0 comments on commit 6619c10

Please sign in to comment.