Autor Téma: Query..Text - divné správanie, zázraky  (Přečteno 650 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5615
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Query..Text - divné správanie, zázraky
« kdy: 10-11-2020, 12:31:24 »
Text vytváram dynamicky. Je to prosté poskladanie viacerých textov. Konečný tvar je vždy rovnaký. Momentálne aj parametre.
Čas vykonania bol cez 18 sek. Hodil som celý text do DB manažéra. Čas 0,2 sek. Urobil som tak aj v IDE. Čas 0,2 sek. Nakoniec som našiel časť, ktorá to spôsobovala. Nič som tam nenašiel. Nejakými trikmi mi to behalo za 0,2 sek. aj pri dynamickej tvorbe textu. S tým so včera ukončil prácu.
Dnes to spustím a opäť to trvá 18 sek :o
Stretol sa niekto s podobným správaním? Tuší niekto o čo sa jedná? Ďakujem.
FB ver. 3.0.7 + FireDAC
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline paja666

  • Nováček
  • *
  • Příspěvků: 48
  • Karma: 0
    • Verze Delphi: 10.4.1 Sydney
Re:Query..Text - divné správanie, zázraky
« Odpověď #1 kdy: 10-11-2020, 12:34:22 »
Jestliže se to nedá krokovat a najít operace, která trvá dlouho, pak je tu možnost to spustit a ve chvíli, kdy to "stojí" stisknout v IDE tlačítko Pause a ukáže se aktuální call stack a místo, kde se program nachází.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5615
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Query..Text - divné správanie, zázraky
« Odpověď #2 kdy: 10-11-2020, 12:36:32 »
Dlho trvá samotné vykonanie dopytu. Mimo môjho kódu.
Je to niečo s N_Final.
Môžem to skúsiť, ale call stack neviem čítať. Neverím, že mi to pomôže. Prikladám texty
Kód: Delphi [Vybrat]
  1. procedure TConsumption.TConsumeOw.CreateSQL;
  2. begin
  3.   inherited;
  4.   FqryUI.SQL.Text := FqryUI.SQL.Text + N_Purge;
  5. end;
  6.  
  7.  
  8. function TConsumption.TConsumeOw.N_Final: string;
  9. begin
  10.   Result :=
  11.   '(SELECT C.FKOWNER_FLAT, DOT.FKSERVICEPARAMETERS, DOT.FKCAANALYTICOPTIONS, DOT.FKSUBACCOUNTS, C.FKMETERS,'+
  12.     ' MP.FKMETERTYPES, C.READING AS READFINAL, C.NUMBER AS N_FINAL, C.CORRECTION, C.KINDSTATE, M.COEFMETER,'+
  13.     ' M.COEFLOCATION,'+
  14.     ' CASE'+
  15.       ' WHEN C.KINDSTATE = :WITHOUTREADING THEN MP.WITHOUTREADING'+
  16.       ' WHEN C.KINDSTATE = :TAMPERING THEN MP.TAMPERING'+
  17.       ' ELSE 1'+
  18.     ' END AS PENALTY'+
  19.   ' FROM CONSUMPTIONS C'+
  20.    ' INNER JOIN METERS M ON (C.FKMETERS = M.IDMETERS)'+
  21.    ' INNER JOIN METERPENALTIES MP ON (M.FKMETERTYPES = MP.FKMETERTYPES) AND (M.FKFOCS = MP.FKFOCS)'+
  22.    ' INNER JOIN OWNER_FLAT ON (C.FKOWNER_FLAT = OWNER_FLAT.IDOWNER_FLAT) AND (OWNER_FLAT.FKFLAT = M.FKFLATS)'+
  23.    ' INNER JOIN DAY_COST_OW_TOTALS DOT ON (OWNER_FLAT.IDOWNER_FLAT = DOT.FKOWNER_FLAT)'+
  24.    ' INNER JOIN SEPA_ANALS SA ON (DOT.FKSERVICEPARAMETERS = SA.FKSERVICEPARAMETERS)'+
  25.       ' AND (M.FKSERVICES = SA.FKSERVICES) AND (DOT.FKCAANALYTICOPTIONS = SA.FKCAANALYTICOPTIONS)'+
  26.   ' WHERE'+
  27.     ' ((C.READING BETWEEN :UPPERBEGIN AND :UPPEREND)'+
  28.       ' OR'+
  29.     ' ((C.READING BETWEEN :LOWEREND1 AND :UPPERBEGIN) AND (C.KINDSTATE = :KS2)))'+
  30.       ' AND (MP.YEARFROM <= :YEARS) AND ((MP.YEARTO >= :YEARS) OR (MP.YEARTO IS NULL))) F';
  31. end;
  32.  
  33.  
  34. function TConsumption.TConsumeOw.N_Initial: string;
  35. begin
  36.   Result :=
  37.   '(SELECT C.FKFOCS, SA.YEARS, C.FKOWNER_FLAT, DOT.FKSERVICEPARAMETERS,'+
  38.     ' DOT.FKCAANALYTICOPTIONS, DOT.FKSUBACCOUNTS, C.FKMETERS, C.READING READINITIAL, C.NUMBER N_INITIAL'+
  39.   ' FROM CONSUMPTIONS C'+
  40.     ' INNER JOIN METERS M ON (C.FKMETERS = M.IDMETERS)'+
  41.     ' INNER JOIN METERPENALTIES MP ON (M.FKMETERTYPES = MP.FKMETERTYPES)'+
  42.       ' AND (M.FKFOCS = MP.FKFOCS)'+
  43.     ' INNER JOIN OWNER_FLAT ON (C.FKOWNER_FLAT = OWNER_FLAT.IDOWNER_FLAT)'+
  44.       ' AND (OWNER_FLAT.FKFLAT = M.FKFLATS)'+
  45.     ' INNER JOIN DAY_COST_OW_TOTALS DOT ON (OWNER_FLAT.IDOWNER_FLAT = DOT.FKOWNER_FLAT)'+
  46.     ' INNER JOIN SEPA_ANALS SA ON (DOT.FKSERVICEPARAMETERS = SA.FKSERVICEPARAMETERS)'+
  47.       ' AND (M.FKSERVICES = SA.FKSERVICES) AND (DOT.FKCAANALYTICOPTIONS = SA.FKCAANALYTICOPTIONS)'+
  48.   ' WHERE'+
  49.     ' ((C.READING BETWEEN :LOWERBEGIN AND :LOWEREND)'+
  50.       ' OR'+
  51.     ' ((C.READING BETWEEN :LOWEREND1 AND :UPPERBEGIN) AND (C.KINDSTATE = :KS1))'+
  52.       ' AND (MP.YEARFROM <= :YEARS) AND ((MP.YEARTO >= :YEARS) OR (MP.YEARTO IS NULL)))) I';
  53. end;
  54.  
  55.  
  56. function TConsumption.TConsumeOw.N_Purge: string;
  57. begin
  58.   Result :=
  59.   'SELECT GEN_ID(SETTLEMENT_ID, 1), I.FKFOCS, I.YEARS, F.FKOWNER_FLAT, F.FKSERVICEPARAMETERS,'+
  60.     ' F.FKCAANALYTICOPTIONS, F.FKSUBACCOUNTS, F.FKMETERTYPES, F.FKMETERS, I.READINITIAL DATEFROM, I.N_INITIAL,'+
  61.     ' CASE'+
  62.       ' WHEN F.READFINAL > :LASTDATE THEN :LASTDATE'+
  63.       ' ELSE F.READFINAL'+
  64.     ' END AS DATETO,'+
  65.     ' F.N_FINAL, F.N_FINAL - I.N_INITIAL AS N_READING, F.COEFMETER, F.COEFLOCATION,'+
  66.     ' CASE'+
  67.       ' WHEN F.KINDSTATE > :KS2 THEN 0'+
  68.       ' ELSE F.N_FINAL - I.N_INITIAL'+
  69.     ' END * F.COEFMETER * F.COEFLOCATION AS N_COEF,'+
  70.     ' CASE'+
  71.       ' WHEN F.KINDSTATE > :KS2 THEN 0'+
  72.       ' ELSE F.CORRECTION'+
  73.     ' END AS CORRECTION,'+
  74.     ' CASE'+
  75.       ' WHEN F.KINDSTATE > :KS2 THEN 0'+
  76.       ' ELSE F.N_FINAL - I.N_INITIAL + F.CORRECTION'+
  77.     ' END * F.COEFMETER * F.COEFLOCATION AS N_CORR,'+
  78.     ' F.KINDSTATE'+
  79.   ' FROM ' +
  80.     N_Initial +
  81.       ' INNER JOIN '+
  82.         N_Final+
  83.     ' ON (I.FKOWNER_FLAT = F.FKOWNER_FLAT) AND (I.FKSERVICEPARAMETERS = F.FKSERVICEPARAMETERS)'+
  84.       ' AND (I.FKCAANALYTICOPTIONS = F.FKCAANALYTICOPTIONS) AND (I.FKSUBACCOUNTS = F.FKSUBACCOUNTS)'+
  85.       ' AND (I.FKMETERS = F.FKMETERS)';
  86. end;
« Poslední změna: 10-11-2020, 12:40:43 od Stanislav Hruška »
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3119
  • Karma: 136
    • Verze Delphi: D2007, XE3, DX10
Re:Query..Text - divné správanie, zázraky
« Odpověď #3 kdy: 10-11-2020, 14:11:47 »
To zase vypada na nejake cachovani dat... Testujes to spatne - to musis vyjit z vychoziho stavu a srovnavat tak srovnatelne, napr.
1. restart pocitace, spustit DB manager, spustit SQL prikaz napr. 3x po sobe a zmerit casy a zapsat je
2. restart pocitace, spustit aplikaci, spustit SQL prikaz take 3x po sobe a zmerit casy a zapsat je.

A teprve, kdyz se ti budou vyrazne lisit casy zejmena 1. pokusu, tak neco resit. A pokud to bude srovnatelne, tak je to dane nactenim dat do bufferu, takze nasledne operace nad stejnymi daty jsou vyrazne rychlejsi do te doby, nez se obsah bufferu ztrati ev. je nahrazen necim jinym. Ale to uz jsme tady resili.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5615
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Query..Text - divné správanie, zázraky
« Odpověď #4 kdy: 10-11-2020, 14:30:41 »
Vďaka. Možno to vyskúšam. Teraz ma vytáča skutočnosť, že v DB manažéry dostanem 450 a v D 1 125 záznamov. Vidím v čom je rozdiel, len si to neviem vysvetliť :'( :'( :'(
Texty sú totožné!!!
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3119
  • Karma: 136
    • Verze Delphi: D2007, XE3, DX10
Re:Query..Text - divné správanie, zázraky
« Odpověď #5 kdy: 10-11-2020, 15:10:54 »
Vďaka. Možno to vyskúšam. Teraz ma vytáča skutočnosť, že v DB manažéry dostanem 450 a v D 1 125 záznamov. Vidím v čom je rozdiel, len si to neviem vysvetliť :'( :'( :'(
Texty sú totožné!!!
Zalezi, jak presne ten pocet kontrolujes, jestli count() nebo jen to, co ti select pise pod tabulkou v DB manageru - ty manazery mivaji bezne omezen pocet zaznamu, takze to muze byt jen zkresleni manageru

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5615
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Query..Text - divné správanie, zázraky
« Odpověď #6 kdy: 11-11-2020, 13:30:07 »
Tak som si dal na tom záležať a prešiel to do detailu.
  • V oboch prípadoch sa jedná o 450 záznamov. Na 1 125 sa doplňuje v ďalších krokoch. Tie nespúšťam
  • Texty sú rovnaké. Akurát v DB manažéri nepoužívam parametre. Hodnoty sú zadané natvrdo
  • DB manažér to má okamžite, aplikácia cez 15 sek. Použil som priamo FqryUI.ExecSQL;
Pri písaní mi napadlo to vyskúšať bez parametrov. A div sa, je to do 1 sek. Mám čo analyzovať. Snáď to vyjde.

W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5615
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Query..Text - divné správanie, zázraky
« Odpověď #7 kdy: 11-11-2020, 14:15:29 »
Čo som urobil:
  • Pre CASE som všetky konštanty v podmienkach zadal priamo do textu - vyhodil parametre
  • Pôvodný text nahradil testovacím. Lebo ináč som mal dlhý čas ???
Vyzerá to, aj po vypnutí PC, že mám čas pod 1 sek. S niečím takým som sa ešte nestretol.

W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3119
  • Karma: 136
    • Verze Delphi: D2007, XE3, DX10
Re:Query..Text - divné správanie, zázraky
« Odpověď #8 kdy: 11-11-2020, 19:21:10 »
  • Pre CASE som všetky konštanty v podmienkach zadal priamo do textu - vyhodil parametre
  • Pôvodný text nahradil testovacím. Lebo ináč som mal dlhý čas ???
No, jestli je to pravda a ma to obecnou platnost, tak jsi objevil dalsi slabe misto FB. To by skoro stalo zato zeptat se primo ptaku ohnivaku, co oni na to.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5615
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Query..Text - divné správanie, zázraky
« Odpověď #9 kdy: 11-11-2020, 19:57:22 »
S tou otázkou si nie som istý. Vyhodil som text a nahradil ho iným, ale obsahovo totožným. A začalo to ísť. No boli tam aj tie parametre.
A tak neviem či to boli tie parametre, alebo ten text, či oboje spolu? Skúmať sa mi to už nechce.
Ale asi sa opýtam.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3119
  • Karma: 136
    • Verze Delphi: D2007, XE3, DX10
Re:Query..Text - divné správanie, zázraky
« Odpověď #10 kdy: 11-11-2020, 22:56:26 »
Ale asi sa opýtam.
Smysl by melo se ptat jen v pripade, ze by sis byl jist temi parametry u WHEN a dokazal to prezentovat na nejakem opakovatelnem prikladu...

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5615
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Query..Text - divné správanie, zázraky
« Odpověď #11 kdy: 12-11-2020, 08:23:55 »
V DB manažéri sa mi to nepodarilo zopakovať. Netuším, kde bol zakopaný pes.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3119
  • Karma: 136
    • Verze Delphi: D2007, XE3, DX10
Re:Query..Text - divné správanie, zázraky
« Odpověď #12 kdy: 12-11-2020, 11:46:32 »
V DB manažéri sa mi to nepodarilo zopakovať. Netuším, kde bol zakopaný pes.
Az priste zase narazis na podobnou ducharinu, nechces hned na zacatku pred detailnejsim zkoumanim udelat restart PC?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5615
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Query..Text - divné správanie, zázraky
« Odpověď #13 kdy: 12-11-2020, 11:57:19 »
Tu som to výnimočne urobil :)
Nemyslím si, žeby v tom mal prsty FireDAC. To by sa už dávno našlo.
Podľa všetkého to bolo spojené s mojim kódom. Ale ten sa obsahovo vôbec nezmenil. Ani som nemal hlásené nekorektné ukončenie riadku. Okrem iného mám vo zvyku medzi DB manažérom a Delphi text najprv dať do PsPad. To platí všeobecne pri prenose textu medzi rôznymi aplikáciami a Delphi.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3119
  • Karma: 136
    • Verze Delphi: D2007, XE3, DX10
Re:Query..Text - divné správanie, zázraky
« Odpověď #14 kdy: 12-11-2020, 13:50:42 »
Tu som to výnimočne urobil :)
No me to pripomela ikonka, ze moje Windows vyzaduji restart a mam vyzkouseno, ze se pak cely system provozovany bez restartu muze chovat dost zhovadile. Ale u tebe je cetnost vyskytu duchariny, ktera sama mizi, aniz by byla lokalizovana, extremne vysoky. Proto bych zacal tim resetem a pokracovanim ze stavu nula. Dost velkou neplechu dokaze take napr. prehrivani pocitace (kdys naposled vyfoukal pocitac?), zacinaji porucha pameti nebo zdroje apod.

Citace
Okrem iného mám vo zvyku medzi DB manažérom a Delphi text najprv dať do PsPad. To platí všeobecne pri prenose textu medzi rôznymi aplikáciami a Delphi.
Ja jsem kdysi take psal SQL rozlamany na radky jako string do kodu a mel jsem makra, ktera dokazala prasit ten text do/z SQL, aby se dal prenaset mezi DB managerem a kodem. Pak jsem leta delal v C# a LINQ, kde jsem si zvykl, ze dotaz je primo soucasti jazyka, podleha typove kontrole prekladacem, zadne praseni stringu.

Tak kdyz jsem byl nucen delat znovu neco v Delphi, tak jsem to praseni SQL ve stringach uz nedokazal vydejchat a uchylil jsem se k technice, ze jsem si nadelal datamoduly s TFDCommand a do nich jsem ty SQL dotazy nastrkal a z nich si je bral napr. do query aj. Prenos mezi DB managerem a aplikaci pak bylo proste copy&paste v obou smerech.