Autor Téma: Veľa záznamov. Ako zrýchliť dopyt.  (Přečteno 2002 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4993
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Veľa záznamov. Ako zrýchliť dopyt.
« kdy: 06-01-2019, 18:19:16 »

V tabuľke SUBACCOUNT_FLAT som vygeneroval 1,23 mil. záznamov. Síce omylom, ale neviem nastaviť indexy tak, aby som dopyt zrýchlil. Nemám vytvorené žiadne indexy.
Kód: [Vybrat]
// Byty ktoré nie sú zahrnuté v podúčte. Nové.
  ' SELECT B.IDBLOCKS, E.IDENTRIES, F.IDFLATS, B.TITLE BLOCKTITLE, E.TITLEFULL ENTRYTITLE, F.FLATNUMBER,'+
    ' 0 ISSUBACCOUNT, 0 IDSUBACCOUNT_FLAT, F.DATEFROM, F.DATETO'+
  ' FROM FLATS F'+
    ' LEFT JOIN SUBACCOUNT_FLAT SF ON (F.IDFLATS = SF.FKFLATS)'+
    ' LEFT JOIN ENTRIES E ON (E.IDENTRIES = F.FKENTRY)'+
    ' INNER JOIN BLOCKS B ON (B.IDBLOCKS = E.FKBLOCKS)'+
    ' LEFT JOIN SUBACCOUNTS S ON (SF.FKSUBACCOUNTS = S.IDSUBACCOUNTS)'+
  ' WHERE S.FKFOCS = :FKFOCS AND SF.FKSUBACCOUNTS IS NULL'+
   ' UNION ALL'+
// Existujúce byty v podúčte
   ' SELECT B.IDBLOCKS, E.IDENTRIES, F.IDFLATS, B.TITLE BLOCKTITLE, E.TITLEFULL ENTRYTITLE, F.FLATNUMBER,'+
     ' SF.ISSUBACCOUNT, SF.IDSUBACCOUNT_FLAT, F.DATEFROM, F.DATETO'+
   ' FROM FLATS F'+
     ' INNER JOIN SUBACCOUNT_FLAT SF ON (F.IDFLATS = SF.FKFLATS)'+
     ' LEFT JOIN ENTRIES E ON (E.IDENTRIES = F.FKENTRY)'+
     ' INNER JOIN BLOCKS B ON (B.IDBLOCKS = E.FKBLOCKS)'+
     ' INNER JOIN SUBACCOUNTS S ON (SF.FKSUBACCOUNTS = S.IDSUBACCOUNTS)'+
   ' WHERE S.FKFOCS = :FKFOCS AND SF.FKSUBACCOUNTS = :FKSUBACCOUNTS'+
   ' ORDER BY 4, 5 ,6';
IDxx sú primárne kľúče. FKxx sú cudzie kľúče
Ako na to?
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4993
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Veľa záznamov. Ako zrýchliť dopyt.
« Odpověď #1 kdy: 07-01-2019, 09:47:57 »
Tak som si urobil analýzu. Problém je v prvom dopyte, ktorý vlastne zožerie všetok čas. 29 s voči 140 ms.
Plan:
 // Byty ktoré nie sú zahrnuté v podúčte. Nové.
PLAN JOIN (JOIN (JOIN (JOIN (F NATURAL, SF INDEX (FK_SUBACCOUNT_FLAT)), E INDEX (PKENTRIES)), B INDEX (PKBLOCKS)), S INDEX (PK_SUBACCOUNTS))
Adapted plan:
 PLAN JOIN (JOIN (JOIN (JOIN (F NATURAL, SF INDEX (FK_SUBACCOUNT_FLAT)), E INDEX (PKENTRIES)), B INDEX (PKBLOCKS)), S INDEX (PK_SUBACCOUNTS))


Vráti mi 0 záznamov. Ako sa to dá upraviť? Ja viem o jednej nepriamej možnosti.
  • Najprv si zistím, či existuje záznam kde je FKSUBACCOUNTS IS NULL. Ak áno spustím oba príkazy s UNION. Ináč len ten druhý.
  • Dá sa to upraviť, tak aby som sa zbavil toho NATURAL?
  • Pomôže tu nejaký index? Podľa toho čo predpokladám, tak nie. Ale ak áno, tak aký?
V prílohe je grafická podoba oboch dopytov. Rozdiel je v pravej časti od FLATS. LEFT kontra INNER JOIN. A hop sa do knižnice študovať :)
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4993
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Veľa záznamov. Ako zrýchliť dopyt.
« Odpověď #2 kdy: 07-01-2019, 10:16:42 »
Dosiahol som polovičný čas ak som v podmienke nahradil S.FKFOCS = :FKFOCS týmto SF.FKFOCS = :FKFOCS
Pre mňa je to významný poznatok
Oprava

Tabuľka SUBACCOUNTS tam je zbytočne. Išla von ale na výsledok to nemá vplyv
« Poslední změna: 07-01-2019, 10:24:12 od Stanislav Hruška »
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4993
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Veľa záznamov. Ako zrýchliť dopyt.
« Odpověď #3 kdy: 07-01-2019, 10:59:12 »
Vďaka pochopeniu čo chcem a čo robím to už je v poriadku. Všetkým ďakujem. Podmienku na FKFOCS som dal na prvú tabuľku - BLOCKS. Na tú nadväzujú ostatné. Tým pádom tam je najmenej FKFOCS.
Doteraz som sa nad tým nemusel zamýšľať, lebo pri pár záznamoch to bolo totálne jedno.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4993
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Veľa záznamov. Ako zrýchliť dopyt.
« Odpověď #4 kdy: 07-01-2019, 11:27:24 »
Nadefinoval som v tabuľke SUBACCOUNT_FLAT jeden zložený index a nestačím sa diviť.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.