Autor Zpráva
Andrej.B
Profil
Zdravim,

mam problem s rychlostou, kedze mam zle postaveny doataz na databazu.
Mam plan vyroby (tabulka PLAN), kde mam hotovy produkt, ktory sa sklada z nejakych komponent. (tabulka BOM) , pokial dam povyberat len na tomto zaklade, tak je dotaz rychly, cca 0.08-0.1s s podmienkami na datum, ak dam select vsetkeho bez podmienok na Datum alebo Group BY, cca 1714 zaznamov, a cas cca 0.8s
Tabulka PLAN ma cca 200 zaznamov /pravdepodobne bude vzdy max. taka velka, cca mesiac naplanovany dopredu/, tabulka BOM /bill of materials/ ma tych zaznamov cca 61 000.
SELECT p.`Č. položky`, p.mnozstvo,p.urobene, b.MJ, b.Popis_komponentu, b.Komponent AS komponent, b.mnozstvo AS mnozstvonakus, 
((p.mnozstvo-p.urobene)*b.mnozstvo) AS mnoztvoALL 
FROM plan p 
JOIN bom b 
ON b.Č_nadradenej_položky = p.`Č. položky` 

 where b.`Č_alternatívy` = '*' AND b.`Typ_štruktúry` = 'Výroba' 
And ((p.mnozstvo-p.urobene) != '0' or (p.mnozstvo-p.urobene) < '0') 
AND b.Platnosť_do = '' AND komponent LIKE 'W%' 
Group by komponent 
Order by komponent DESC;

Problem je, ze potrebujem aj vypist kategoriu toho komponentu, ktory dostavam z tabulky BOM. Tie su ulozene v tabulke kategoria_produkt, ktora ma 4000 zaznamov.

Ked pridam tuto tabulku do predchadzajuceho selectu

SELECT p.`Č. položky`, p.mnozstvo,p.urobene, b.MJ, b.Popis_komponentu,  b.Komponent AS komponent, b.mnozstvo AS mnozstvonakus,
((p.mnozstvo-p.urobene)*b.mnozstvo) AS mnoztvoALL, k.kategoria
FROM plan p 
JOIN bom b
         ON b.Č_nadradenej_položky = p.`Č. položky`
         
JOIN kategoria_produkt k
         ON k.`Č. položky` = b.komponent         
         
where p.Datum = '2021-11-22'
AND
b.`Č_alternatívy` = '*'
AND
b.`Typ_štruktúry` = 'Výroba'

And ((p.mnozstvo-p.urobene) != '0' or (p.mnozstvo-p.urobene) < '0')


AND b.Platnosť_do = ''
AND komponent  LIKE 'W%'

Group by komponent
Order by komponent DESC

Tato cast
JOIN kategoria_produkt k
         ON k.`Č. položky` = b.komponent    
mi urobi len pri jednom datume kde su v Tabulke PLAN len 2 zaznamy cca 40-60sekund, pokial dam nejaky datum co ma viac riadkov z PLAN, tak mi script skonci na case.
Pravdepodobne to hlada ako 200x61000x4000 riadkoch?

Zatial som to dal, ze si vytiahnem vsetko z toho prveho selectu PLAN a BOM a potom pri vypise si urobit dalsi select cisto len na tabulku kategoria_produkt kde si vyberam
WHERE Č. položky = $row_nakup_all['komponent']
cas je cca na vsetko 2s - max 5s

Ako vylepsit ten Select aby som to mohol mat v tom jednom dotaze na DB, alebo to robit cez tie dva, tak sa to ma robit normalne?

Dakujem.
Kajman
Profil
Jaké jsou struktury tabulek včetně indexů? Jaký je explain dotazu?
anonym_
Profil *
Andrej.B:
Pravdepodobne to hlada ako 200x61000x4000 riadkoch?
JOIN přes 3 tabulky s pár řádky je běžný a určitě nemá trvat déle jak pár ms. I těch 2-5s je minimálně o řád více, než by to mělo v těchto počtech řádků být.
Andrej.B
Profil
Kajman:
Jaké jsou struktury tabulek včetně indexů? Jaký je explain dotazu?

Preco Vas nemam vedla seba?
Chybal Index na tom komponente v BOM, blbec. uz je to ok.
Pri nahravani novych dat, obcas blbnem s update v aplikacii a chcem zase predchadzajuce neporusene data, som si neuvedomil, ze tie nemaju Index. Uz mam zalohovane data s indexami.

Dakujem

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