Databáze > Firebird a Interbase

Skrátenie času dopytu vytvorením indexu

(1/3) > >>

Stanislav Hruška:


--- Kód: ---CREATE TABLE DEPOSITS (
  IDDEPOSITS                    PRIMARYKEY,
  FKFOCS                        FOREIGNKEY,
  FKOWNER_FLAT                  FOREIGNKEY,
  FKSERVICEPARAMETERS           FOREIGNKEY,
  DEPOSIT                         CURRENCY NOT NULL,
  DEPOSITPERIOD                   DATEFROM,
  PAY                             CURRENCY DEFAULT 0 NOT NULL,
  CONSTRAINT PK_DEPOSITS PRIMARY KEY (IDDEPOSITS)
);
CREATE ASC INDEX DEPOSITS_IDX1 ON DEPOSITS (DEPOSITPERIOD);
CREATE ASC INDEX I_DEPOSITS_ ON DEPOSITS (DEPOSITPERIOD, FKFOCS); //  Pridané
--- Konec kódu ---
Text dopytu:

--- Kód: ---WITH D AS
  (SELECT D.FKOWNER_FLAT, SUM(D.DEPOSIT) AS DEPOSIT, SUM(D.PAY) AS PAID
  FROM DEPOSITS D
  WHERE D.DEPOSITPERIOD BETWEEN '1.1.2022' AND '1.12.2022' AND D.FKFOCS = 3130
  GROUP BY D.FKOWNER_FLAT)   
//  Táto časť nie je zaujímavá. Je rýchla
SELECT D.FKOWNER_FLAT, F.FLATNUMBER, O.FULLNAME, D.DEPOSIT, D.PAID, (D.PAID - D.DEPOSIT) AS DIFFERENCE
FROM FLATS F
  INNER JOIN OWNER_FLAT OWF ON F.IDFLATS = OWF.FKFLAT
  INNER JOIN D ON OWF.IDOWNER_FLAT = D.FKOWNER_FLAT
  INNER JOIN OWNERS O ON OWF.FKOWNERS = O.IDOWNERS
--- Konec kódu ---
Údaje o záznamoch - Počet:

* záznamov mám 16 740 000
* FOC 15 = 1 116 000 záznamov na FOC
* FKOWNER_FLAT 4 500Nenastolo žiadne skrátenie času vykonania dopytu. Viď druhý index. Čo ma prekvapilo.
Ako mám vlastne definovať indexy, aby som mal z toho zisk. Najčastejšie podmienky vo WHERE sú na

* DEPOSITPERIOD
* FKFOCS a DEPOSITPERIOD
* FKOWNER_FLAT a DEPOSITPERIOD - + prípadne FKFOCSAnalýza plánu
--- Kód: ---Select Expression
    -> Nested Loop Join (inner)
        -> Nested Loop Join (inner)
            -> Aggregate
                -> Filter
                    -> Table "DEPOSITS" as "D D" Access By ID
                        -> Index "FK_DEPOSIT_OWF" Full Scan
                            -> Bitmap And
                                -> Bitmap
                                    -> Index "DEPOSITS_IDX1" Range Scan (lower bound: 1/1, upper bound: 1/1)
                                -> Bitmap
                                    -> Index "FK_DEPOSITS_FOCS" Range Scan (full match)
            -> Filter
                -> Table "OWNER_FLAT" as "OWF" Access By ID
                    -> Bitmap
                        -> Index "PK_OWNER_FLAT" Unique Scan
        -> Filter
            -> Table "FLATS" as "F" Access By ID
                -> Bitmap
                    -> Index "PKFLATS" Unique Scan
        -> Filter
            -> Table "OWNERS" as "O" Access By ID
                -> Bitmap
                    -> Index "PK_OWNERS" Unique Scan
--- Konec kódu ---

Stanislav Hruška:
+ otázka B)
Má význam robiť index nad dátumom DEPOSITPERIOD? Pomôže mi to v niečom? Momentálne ho mám definovaný
Viem, že cudzie kľúče sú automaticky indexované.

pf1957:

--- Citace: Stanislav Hruška  04-12-2022, 12:59:22 ---Má význam robiť index nad dátumom DEPOSITPERIOD? Pomôže mi to v niečom? Momentálne ho mám definovaný
Viem, že cudzie kľúče sú automaticky indexované.

--- Konce citace ---
Hele, co kdybys postupoval metodou blbec a ty indexy nasazel vsude (pozor na FB, ktery nekde musi mit ascending i descending index), zmeril si to a pak je odebiral a nechal tam jen ty, kterymi dosahnes nejlepsich casu?

Stanislav Hruška:
Metóda blbec je moja najobľúbenejšia a najviac používaná. Akurát ju nazývam tak krajšie, ale menej výstižne. Pokus-omyl.
Mám len jeden index - nad dátumom.
Skúsil som DEPOSITPERIOD + FKFOCS a DEPSITPERIOD + FKFOCS + FKOWNER_FLAT. Už som ich vyhodil. Viac kombinácii asi nemá zmysel skúšať.
Najväčšie zrýchlenie dostávam ak

* vložím do WHERE FKFOCS = :FKFOCS. To sa z 30 a viac sekúnd razom dostanem na 0,5 s
* občas pomôže ak prepojím FKFOCS v dvoch tabuľkách. Zdá sa mi, že až raz ;D  Aj keď ten INNER je navyše. Toto je jedine pokus-omylMne sa tam nepáči " -> Index "FK_DEPOSIT_OWF" Full Scan". Neviem ako by som sa ho zbavil. Tu by určite pomohlo pretlačenie použitia indexu.

pf1957:

--- Citace: Stanislav Hruška  04-12-2022, 15:25:24 ---Mne sa tam nepáči " -> Index "FK_DEPOSIT_OWF" Full Scan". Neviem ako by som sa ho zbavil. Tu by určite pomohlo pretlačenie použitia indexu.

--- Konce citace ---
To je nejaky odkaz na umely PK v propojovaci tabulce m:n mezi OWNER a FLAT? Nebo co to je? Tam se podivej, jak mas indexy. A u te periody zkus udelat asc i desc index, jestli to nepomuze.

Navigace

[0] Seznam témat

[#] Další strana

Přejít na plnou verzi