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

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4336
  • Karma: 38
    • Verze Delphi: XE7 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?
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4336
  • Karma: 38
    • Verze Delphi: XE7 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ť :)
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4336
  • Karma: 38
    • Verze Delphi: XE7 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 »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4336
  • Karma: 38
    • Verze Delphi: XE7 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.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4336
  • Karma: 38
    • Verze Delphi: XE7 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ť.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.