Autor | Zpráva | ||
---|---|---|---|
Stroganov Profil * |
#1 · Zasláno: 13. 10. 2022, 22:31:19
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 |
#2 · Zasláno: 14. 10. 2022, 07:37:40
Analyze nad oběma tabulkama plán neopraví?
V první tabulce bych pro ten dotaz čekal index na sloupcem column4. |
||
Časová prodleva: 11 dní
|
|||
Stroganov Profil * |
#3 · Zasláno: 25. 10. 2022, 00:36:50
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! |
||
Časová prodleva: 2 roky
|
0