-- hypothetical indexes using INCLUDE keyword, pg11+ -- Remove all the hypothetical indexes if any SELECT hypopg_reset(); hypopg_reset -------------- (1 row) -- Make sure stats and visibility map are up to date VACUUM ANALYZE hypo; -- Should not use hypothetical index -- Create normal index SELECT COUNT(*) AS NB FROM hypopg_create_index('CREATE INDEX ON hypo (id)'); nb ---- 1 (1 row) -- Should use hypothetical index using a regular Index Scan SELECT COUNT(*) FROM do_explain('SELECT val FROM hypo WHERE id = 1') e WHERE e ~ 'Index Scan.*<\d+>btree_hypo.*'; count ------- 1 (1 row) -- Remove all the hypothetical indexes SELECT hypopg_reset(); hypopg_reset -------------- (1 row) -- Create INCLUDE index SELECT COUNT(*) AS NB FROM hypopg_create_index('CREATE INDEX ON hypo (id) INCLUDE (val, "Id2")'); nb ---- 1 (1 row) -- Should use hypothetical index using an Index Only Scan SELECT COUNT(*) FROM do_explain('SELECT val FROM hypo WHERE id = 1') e WHERE e ~ 'Index Only Scan.*<\d+>btree_hypo.*'; count ------- 1 (1 row) -- Deparse the index DDL SELECT hypopg_get_indexdef(indexrelid) FROM hypopg(); hypopg_get_indexdef ------------------------------------------------------------------- CREATE INDEX ON public.hypo USING btree (id) INCLUDE (val, "Id2") (1 row) -- Check that indkey covers all attributes, while indcollations and indclass -- only cover key columns SELECT array_length(indkey, 1) = innatts AND array_length(indcollation, 1) = 1 AND array_length(indclass, 1) = 1 AS key_vectors_match FROM hypopg(); key_vectors_match ------------------- t (1 row)