Autor Zpráva
Stroganov
Profil *
Dobrý večer,

v redakčnom systéme, ktorý spravujem, je databáza v dosť zlom stave. Veľa napovie už používaná verzia - Postgre 9. Narazil som na jeden konkrétny problém, s ktorým si neviem poradiť.

Potrebujem spojiť 2 veľké tabuľky. tabulka1 má cca. 300-tisíc riadkov, tabulka2 vyše 1 milióna.

Tento príkaz:

SELECT tabulka1.column1 AS username, tabulka1.column2 AS active, tabulka1.column3 AS password 
FROM tabulka1 
JOIN tabulka2 ON tabulka1.column4 = tabulka2.sloupec
AND Upper(tabulka2.email)='MAIL@EXAMPLE.COM'

Pozn.: Heslo je, samozrejme, ukladané ako hash.

Postgre spraví merge join, ktorý trvá vyše 2 sekundy. Na tabuľke tabulka1 odignoruje index.

Ak na koniec toho istého príkazu doplním limit 1, tak Postgre zmení stratégiu a spraví Nested Loop, ktorý trvá 0.3 sekundy. Využije index tabulka1, nevyužije index na Upper(tabulka2.email). Podobne sa správa aj limit 100000, ibaže urobí hash join namiesto nested loop a využije index na Upper(), ale nie ten v tabulka1 - trvanie 0,3 sekundy.

Problém je, že potrebujem tento príkaz vyladiť tak, aby dobre fungoval aj bez limitu.

Zaujímavé existujúce indexy:

tabulka1
(column1)
(column2)
(column3)
(column2, column1, column3)

tabulka2
(sloupec)
(Upper(email))

Až teraz počas písania na fórum mi napadá, že v tabulka2 nemám index (sloupec, Upper(email)) - pomohlo by takéto rozšírenie alebo skôr treba (Upper(email), sloupec)?

Je možné tento príkaz zoptimalizovať ešte iným spôsobom?

Vopred ďakujem za odpoveď.
Kajman
Profil
Analyze nad oběma tabulkama plán neopraví?

V první tabulce bych pro ten dotaz čekal index na sloupcem column4.
Stroganov
Profil *
Kajman:
V první tabulce bych pro ten dotaz čekal index na sloupcem column4.

Ospravedlňujem sa za dlhšiu odmlku, tento index tam skutočne chýbal, rozbehlo sa to. Veľmi pekne ďakujem za pomoc!

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0