Juliusz Mikoda

Juliusz Mikoda Projektant,
programista

Temat: Zapytanie MySQL

Witam
Mam pytanko. Jak można zoptymalizować zapytanie:

SELECT * FROM HRHEAD,CUHEAD,UMHEAD
WHERE HRSTAT'90'
AND HRTGNO=[tydzień]
AND HRPRON=[osoba]
AND HRCUNO=CUCUNO
AND HRUMNO=UMOWNO
ORDER BY CUZAMI,CUZAUL,CUZANO,HRCUNO,HRUMNO;
HRHEAD – rozrasta się ok. 3000 krotek na tydzień 20-kolumn
CUHEAD - rozrasta się ok. 100 krotek na tydzień 30-kolumn
UMHEAD - rozrasta się ok. 150 krotek na tydzień 40-kolumn
Z zapytania średnio jest wybierane od 50 do 500 krotek

Za pomoc z góry dziękuję
Juliusz

konto usunięte

Temat: Zapytanie MySQL

Pytanie podstawowe: jak są pozakładane indeksy na tych tabelach i jak wygląda plan zapytania (EXPLAIN SELECT ...) ?
Juliusz Mikoda

Juliusz Mikoda Projektant,
programista

Temat: Zapytanie MySQL

Indeksy: CUCUNO HRUMNO UMOWNO
Wiem że w czasie wywałania zapytania jest twożona duża tabela pomocnicza. Zastanawiałem się czy jest możliwe ominięcie tej operacji. Mam możliwość opytywania tabel po kolei ale to trochę rozszerzy liczb wykonywanych zapytań.

konto usunięte

Temat: Zapytanie MySQL

To proponowałbym na początek założenie indeksu na kolumny (HRSTAT, HRTGNO, HRPRON) - optymalizator powinien wtedy najpierw wybierać rekordy z tabeli HRHEAD, a dopiero potem dokonywać złączenia z tabelami CUHEAD i UMHEAD.
Juliusz Mikoda

Juliusz Mikoda Projektant,
programista

Temat: Zapytanie MySQL

Znalazłem rozwiązanie w trochę inny sposób.

SELECT * FROM (SELECT * FROM HRHEAD WHERE HRSTAT'90'
AND HRTGNO=[tydzień] AND HRPRON=[osoba]) as hr,CUHEAD,UMHEAD WHERE hr.HRCUNO=CUCUNO AND hr.HRUMNO=UMOWNO ORDER BY CUZAMI,CUZAUL,CUZANO,hr.HRCUNO,hr.HRUMNO;

Działa super szybko.
Jacek Ołowiak

Jacek Ołowiak kierownik zespołu IT

Temat: Zapytanie MySQL

a nie powinno... sproboj tez z 'having'
Juliusz Mikoda

Juliusz Mikoda Projektant,
programista

Temat: Zapytanie MySQL

Dytektywa HAVING używana jest w przypadku kolumny uzyskanej z funkcji agregującej (count, sum itp.) ja takowej w tym zapytaniu nie użyłem. Więc nie wiem do czego miał bym tej dyrektywy użyć.



Wyślij zaproszenie do