Autor Téma: Testovanie - veľké odozvy  (Přečteno 287 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5307
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Testovanie - veľké odozvy
« kdy: 14-09-2020, 22:42:35 »

Kód: [Vybrat]
SELECT MAX(D.IDDEPOSITS) AS IDDEPOSITS, D.FKFOCS
FROM DEPOSITS D
GROUP BY D.FKFOCS
V rámci testovania som do tabuľky DEPOSITS vygeneroval 2 mil. záznamov. Získanie výsledku trvá 1 min. A to je len časť celkového dopytu.
Dá sa tu niečo urobiť na zrýchlenie?
Kód: [Vybrat]
CREATE TABLE DEPOSITS (
  IDDEPOSITS PRIMARYKEY NOT NULL,
  FKFOCS FOREIGNKEY NOT NULL,
  FKOWNER_FLAT FOREIGNKEY NOT NULL,
  FKSERVICEPARAMETERS FOREIGNKEY NOT NULL,
  DEPOSIT CURRENCY DEFAULT '0.0' NOT NULL,
  DEPOSITPERIOD DATEFROM NOT NULL,
  PAY CURRENCY DEFAULT 0 NOT NULL);
.
ALTER TABLE DEPOSITS ADD CONSTRAINT PK_DEPOSITS PRIMARY KEY (IDDEPOSITS);
ALTER TABLE DEPOSITS ADD CONSTRAINT FK_DEPOSITS_FOCS FOREIGN KEY (FKFOCS) REFERENCES FOCS(IDFOCS);
ALTER TABLE DEPOSITS ADD CONSTRAINT FK_DEPOSIT_OWF FOREIGN KEY (FKOWNER_FLAT) REFERENCES OWNER_FLAT(IDOWNER_FLAT);
ALTER TABLE DEPOSITS ADD CONSTRAINT FK_DEPOSIT_SERPARAM FOREIGN KEY (FKSERVICEPARAMETERS) REFERENCES SERVICEPARAMETERS(IDSERVICEPARAMETERS);
CREATE INDEX DEPOSITS_IDX1 ON DEPOSITS(DEPOSITPERIOD);
.
COMMENT ON COLUMN DEPOSITS.DEPOSITPERIOD IS 'Pre SIPO len celé mesiace. Pre vyúčtovanie podľa dní.';
.
GRANT SELECT, INSERT, DELETE, REFERENCES, UPDATE ON DEPOSITS TO SYSDBA WITH GRANT OPTION;
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Online vandrovnik

  • Guru
  • *****
  • Příspěvků: 1070
  • Karma: 47
    • Verze Delphi: 10.3
Re:Testovanie - veľké odozvy
« Odpověď #1 kdy: 14-09-2020, 22:54:51 »
Jak dlouho běží tohle?

Kód: [Vybrat]
SELECT DISTINCT D.FKFOCS
FROM DEPOSITS D

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5307
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Testovanie - veľké odozvy
« Odpověď #2 kdy: 14-09-2020, 23:13:00 »
Práve som to vyskúšal :)
Kód: [Vybrat]
SELECT DISTINCT D.DEPOSITPERIOD, D.FKFOCS
FROM
  DEPOSITS D
GROUP BY
  D.FKFOCS, D.DEPOSITPERIOD
s časom 4-5 sek. Mám na čom budovať. To vyzerá nádejne.
Aj tak ďakujem ;)
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Online vandrovnik

  • Guru
  • *****
  • Příspěvků: 1070
  • Karma: 47
    • Verze Delphi: 10.3
Re:Testovanie - veľké odozvy
« Odpověď #3 kdy: 14-09-2020, 23:25:08 »
Možná to jde i líp, ale dalo by se použít něco jako:

Kód: [Vybrat]
SELECT
 x.FKFOCS,
 (SELECT MAX(y.IDDEPOSITS) FROM DEPOSITS y WHERE (y.FKFOCS=x.FKFOCS)) as MaxIDDEPOSITS
FROM
(
SELECT DISTINCT
 d.FKFOCS
FROM DEPOSITS d
)  x

A bude to chtít složený index z polí FKFOCS a IDDEPOSITS, možná ten index bude muset být DESC, tím si nejsem jistý.
To SELECT DISTINCT asi projde všechny řádky (natural scan), ale ta první část už využije index.

Online vandrovnik

  • Guru
  • *****
  • Příspěvků: 1070
  • Karma: 47
    • Verze Delphi: 10.3
Re:Testovanie - veľké odozvy
« Odpověď #4 kdy: 14-09-2020, 23:30:58 »
Jinak jestli tohle trvá dlouho:

Kód: [Vybrat]
SELECT DISTINCT D.FKFOCS
FROM DEPOSITS D

a přitom d.FKFOCS odkazuje na nějaký číselník (a je tam ten foreign index), může být o dost rychlejší tohle:

Kód: [Vybrat]
SELECT a.IDFOCS
FROM FOCS a
WHERE EXISTS (SELECT * FROM DEPOSITS d WHERE (d.FKFOCS=a.IDFOCS))

Když to dáš do té druhé části v mém předchozím příspěvku, mohlo by to dávat výsledky rychle - testoval jsem to na podobných datech, asi 2,5 M záznamů a IB Expert jen tak nějak přeblikne a vypíše výsledky.
« Poslední změna: 14-09-2020, 23:34:23 od vandrovnik »

Online pf1957

  • Padawan
  • ******
  • Příspěvků: 2929
  • Karma: 135
    • Verze Delphi: D2007, XE3, DX10
Re:Testovanie - veľké odozvy
« Odpověď #5 kdy: 15-09-2020, 11:08:42 »
SELECT MAX(D.IDDEPOSITS) AS IDDEPOSITS, D.FKFOCS
[...]
  IDDEPOSITS PRIMARYKEY NOT NULL,
Melo by pomoci vytvorit pro IDDEPOSITS descending index. Sice je to PK, ale ten je vzdy ascending. Schvalne nejdriv vyzkousej rozdil mezi MAX() a MIN().

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5307
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Testovanie - veľké odozvy
« Odpověď #6 kdy: 15-09-2020, 11:19:52 »
Teraz robím analýzu pôvodného dopytu.
Už viem čo chcem a potrebujem. Pri jeho tvorbe som to ešte nevedel. A tápal som v mnohých veciach.
Po analýze budem múdrejší a budem vediem rozumne použiť tu dané návrhy!
Už pri prvom prechode mi z neho vypadlo jedno pole ;)  Podľa zbežného náhľadu aj jeden Query v UNION !!!
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5307
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Testovanie - veľké odozvy
« Odpověď #7 kdy: 15-09-2020, 12:19:20 »
Ten " MAX(D.IDDEPOSITS) AS IDDEPOSITS" som vyhodil už ako bezpredmetný.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5307
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Testovanie - veľké odozvy
« Odpověď #8 kdy: 15-09-2020, 13:24:26 »
Narazil som na zaujímavú skutočnosť a akosi jej nerozumiem
Kód: [Vybrat]
WITH MM AS
(
SELECT DISTINCT D.DEPOSITPERIOD, D.FKFOCS
FROM DEPOSITS D
WHERE (EXTRACT (YEAR FROM D.DEPOSITPERIOD) = 2016)
)
.
SELECT MIN(MM.DEPOSITPERIOD) AS MINPER, MAX(MM.DEPOSITPERIOD) AS MAXPER, MM.FKFOCS
FROM MM
GROUP BY MM.FKFOCS
Samotný WITH trvá 10.4 sek. 600 záznamov
Celý dopyt LEN 3,8 sek! 100 záznamov
To ma veľmi potešilo. Rád by som vedel prečo je tomu tak. Nad DEPOSITPERIOD mám asc index
To nad DEPOSITS s 3 487 600 záznamov. Všetky spadajú do roka 2016.
« Poslední změna: 15-09-2020, 13:25:58 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ů: 5307
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Testovanie - veľké odozvy
« Odpověď #9 kdy: 15-09-2020, 14:33:27 »
Nakoniec som došiel k riešeniu
Kód: [Vybrat]
WITH MM AS
(
SELECT DISTINCT D.DEPOSITPERIOD, D.FKFOCS
FROM DEPOSITS D
WHERE (EXTRACT (YEAR FROM D.DEPOSITPERIOD) = 2016)
),
YM AS
(
SELECT DISTINCT D.DEPOSITPERIOD, D.FKFOCS
FROM DEPOSITS D
)
.
SELECT AA.FKFOCS, AA.MINPER, AA.MAXPER, BB.MINYEAR, BB.MAXYEAR
FROM
(
SELECT F.IDFOCS
FROM FOCS F
WHERE (F.ISACTIVE = 1) AND (F.DELETED = 0) AND (F.FKUSERAPPS = 1)
) FO
  INNER JOIN
(
(
SELECT MIN(MM.DEPOSITPERIOD) AS MINPER, MAX(MM.DEPOSITPERIOD) AS MAXPER, MM.FKFOCS
FROM MM
GROUP BY MM.FKFOCS
) AA
INNER JOIN 
(
SELECT MIN(YM.DEPOSITPERIOD) AS MINYEAR, MAX(YM.DEPOSITPERIOD) AS MAXYEAR, YM.FKFOCS
FROM YM
GROUP BY YM.FKFOCS
) BB
ON (AA.FKFOCS = BB.FKFOCS)
)
ON (FO.IDFOCS = AA.FKFOCS)
s časom 7 sek, čo je vynikajúce :)
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5307
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Testovanie - veľké odozvy
« Odpověď #10 kdy: 15-09-2020, 20:02:15 »
OT:
Zistil som, že ladenie/optimalizácia aplikácie je v podstate veľká sranda.
Prvý problém som riešil v tomto vlákne. Celý natešený som spustil aplikáciu a opäť čakám. Hneď pri prvej triede (vlastne ďalší riadok). Mám tam funkciu na ukladanie hodnôt pre každé SVB. Pre jedno SVB to trvá nejakých 4356 msec. Pri 100 SVB už tam mám > 7 min ;D . A to som vynechal jednu akciu, ktorá sama osebe trvá nejaké minúty. Ani neviem koľko.
Viem, že v programe nikdy nebude 100 SVB a ani 32 000 bytov. Ale viem, že takto poriadne vyladím aplikáciu.
Spätným náhľadom do kódu, určite nejaký ten rok, som zistil, že vo funkcii používam Query. V mnohých prípadoch to nie je nutné. Úplne mi postačia hodnoty, ktoré sme riešili tu! Mám ich uložené v samostatnom zozname.
.
Čo všetko sa človek dozvie o vlastnom programe :o ::) . Ani netreba spúšťať nejaký profiler 8)
« Poslední změna: 15-09-2020, 20:03:48 od Stanislav Hruška »
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Online vandrovnik

  • Guru
  • *****
  • Příspěvků: 1070
  • Karma: 47
    • Verze Delphi: 10.3
Re:Testovanie - veľké odozvy
« Odpověď #11 kdy: 15-09-2020, 22:17:31 »
Excellent
Rated 1 time
Ten " MAX(D.IDDEPOSITS) AS IDDEPOSITS" som vyhodil už ako bezpredmetný.

Tobě je vyloženě "radost" s něčím radit.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5307
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Testovanie - veľké odozvy
« Odpověď #12 kdy: 16-09-2020, 11:58:09 »
To neznamená, že to nepoužijem. Iba sa pôvodné riešenie tak zmenilo, že to tam vypadlo. Pomohlo mi to v hľadaní správneho riešenia.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.