sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL CROSS JOIN-indexering för prestanda

Ditt största problem är OR — du kan aldrig få anständig prestanda så länge du har en OR så här i din WHERE klausul.

Skriv om frågan enligt följande:

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','%'));

Se sedan till att du har följande index (förutom indexen på 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);

Det borde göra skillnad.




  1. mysql radering av dubbletter av data

  2. MySQL 'skapa schema' och 'skapa databas' - Finns det någon skillnad

  3. PostgreSQL, kan inte uppdatera rad (med säkerhet på radnivå)

  4. Postgresql:Kontrollera om Schema existerar?