Ihr Hauptproblem ist das OR
– Sie können niemals eine anständige Leistung erzielen, solange Sie ein OR
haben so in Ihrem WHERE
Klausel.
Schreiben Sie die Abfrage wie folgt um:
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','%'));
Stellen Sie dann sicher, dass Sie die folgenden Indizes haben (abgesehen von den Indizes auf der 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);
Das sollte einen Unterschied machen.