Em um plano de consulta, vejo o tipo de linha sendo lançado. Existe um índice que deveria ser usado e não é. O typecast é uma bandeira vermelha?
A tabela teve um ANALYZE e possui 110 milhões de linhas. Destes, 10% correspondem à consulta.
Aqui está a explicação completa:
explain select * from item_info where subtype = 'Dataset';
QUERY PLAN
------------------------------------------------------------------------------------
Gather (cost=1000.00..1592021.24 rows=1320650 width=27)
Workers Planned: 2
-> Parallel Seq Scan on item_info (cost=0.00..1458956.24 rows=550271 width=27)
Filter: ((subtype)::text = 'Dataset'::text)
(4 rows)
Time: 0.652 ms=> \d item_info
Table "public.item_info"
Column | Type | Collation | Nullable | Default
--------------+-------------------+-----------+----------+---------
root_item_pk | bigint | | not null |
type | character varying | | |
subtype | character varying | | |
Indexes:
"item_info_pkey" PRIMARY KEY, btree (root_item_pk)
"item_info_subtype_idx" btree (subtype)
"item_info_type_idx" btree (type)
Não. Pelo menos não entre varchar e texto. O fato de esperar 1320650 linhas pode ser um sinal de alerta. Por que usar um índice se você precisa ler uma grande parte da tabela?