PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Indexação PostgreSQL CROSS JOIN para desempenho


Seu principal problema é o OR — você nunca terá um desempenho decente enquanto tiver um OR assim no seu WHERE cláusula.

Reescreva a consulta da seguinte forma:
SELECT * FROM main_transaction t 
   JOIN main_profile p ON t.profile_id = p.id
   JOIN main_customer c ON p.user_id = c.id 
WHERE upper(t.request_no) LIKE upper(concat('%','0-90-6 12 ','%'))
UNION
SELECT * FROM main_transaction t 
   JOIN main_profile p ON t.profile_id = p.id
   JOIN main_customer c ON p.user_id = c.id 
WHERE upper(c.phone) LIKE upper(concat('%','0-90-6 12','%'));

Em seguida, certifique-se de ter os seguintes índices (além dos índices no id s):
CREATE INDEX ON main_transaction (profile_id);
CREATE INDEX ON main_transaction USING gin (upper(request_no) gin_trgm_ops);
CREATE INDEX ON main_profile (user_id);
CREATE INDEX ON main_customer USING gin (upper(phone) gin_trgm_ops);

Isso deve fazer a diferença.