Dado:
postgres=# \d b
Table "public.b"
Column | Type | Collation | Nullable | Default
--------+------+-----------+----------+---------
a | uuid | | not null |
Indexes:
"b_a_idx" btree (a)
postgres=# \d c
Table "public.c"
Column | Type | Collation | Nullable | Default
--------+------+-----------+----------+---------
a | text | | not null |
Indexes:
"c_a_idx" btree (a)
postgres=# explain b;
ERROR: syntax error at or near "b"
LINE 1: explain b;
^
postgres=# analyze b;
ANALYZE
postgres=# analyze c;
ANALYZE
Por que a consulta a seguir não usa b.a
o índice de ?
postgres=# explain (select * from b join c on (b.a :: text) = c.a);
QUERY PLAN
---------------------------------------------------------------------------------
Merge Join (cost=129.05..455.25 rows=12580 width=48)
Merge Cond: (c.a = ((b.a)::text))
-> Index Only Scan using c_a_idx on c (cost=0.15..64.55 rows=1360 width=32)
-> Sort (cost=128.89..133.52 rows=1850 width=16)
Sort Key: ((b.a)::text)
-> Seq Scan on b (cost=0.00..28.50 rows=1850 width=16)
(6 rows)
Como o índice armazena apenas o valor UUID de
a
, não o resultado da expressãoa::text
Para tornar o índice elegível para uso, você precisa converter a outra coluna no tipo de dados armazenado no índice, por exemplo
Observe que isso não garante que o índice seja usado, apenas torna possível .
Mas como a consulta recupera todas as linhas de ambas as tabelas, é altamente improvável que o índice seja usado de qualquer maneira.