Databáze > Firebird a Interbase
Skrátenie času dopytu vytvorením indexu
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