Autor Téma: Pomale FireDAC/AnyDAC na iOS  (Přečteno 2953 krát)

Offline Andy

  • Mladík
  • **
  • Příspěvků: 51
  • Karma: 0
Pomale FireDAC/AnyDAC na iOS
« kdy: 05-06-2013, 14:32:30 »
Ahoj lidi
delam aplikaci v XE4 pro iOS je to dosti rozsahla aplikace z lokalni SQLite a "realtimovou" synchronizaci na MySQL na server.

Aktualni problem je v tom ze jsou hrozne a primo priserne odezvy od SQLite na uplne jednoduchy dotaz
Kód: [Vybrat]
SELECT * FROM mydata WHERE SHORTNAME LIKE "'+sname+'" AND ACTIVE = "true"ktery vybere nazev polozky a vlozi ho do tabulky (StringGrid).

Nic extra jsem nekonfiguroval proste jen jednoducha db a na form placle komponenty od FireDAC
kdyz jsem pouzival UniDAC tak to jelo jako blesk presel jsem na firedac a vyber polozky z db a vlozeni do tabulky trva vterinu a postupne se dostane az na dve
coz je neprijatelne.
Osobne jsem z SQLite nikdy noc nedelal, takze jaksi mozna tam staci zapnout neco a bude to. Proste jen mne prekvapuje ze UniDAC jsem tez nenastavoval a bylo to super.
jedine co menim oproti vychozimu nastaveni je
Kód: Delphi [Vybrat]
  1.   oParams := TStringList.Create;
  2.   oParams.Add('Database=' + SYS_DATADIR + 'config');
  3.   oParams.Add('Pooled=True');
  4.   oParams.Add('JournalMode=Off');
  5.   ADManager.AddConnectionDef('SQLite_My', 'SQLite', oParams);
  6.  
a to je kvuli Poolingu ze pouzivam thready ale jen jeden konektor

Jo a moje otazka je zda nevite nekdo jak to mam nastavit aby mi zase vybery fungovaly rychle jako driv?
Za kazdou dobrou radu predem diky Andy


Petr Houf

  • Host
Re:Pomale FireDAC/AnyDAC na iOS
« Odpověď #1 kdy: 06-06-2013, 11:10:02 »
Dobrý den,
pokud byly podmínky při použití AnyDAC a FireDAC shodné (rychlost byla měřena na stejném fyzickém zařízení nebo v simulátoru, tatáž velikost DB a její nastavení) nebude problém v SQLite. Nicméně přesto doporučuji zkontrolovat, zda jsou sloupce v kterých se vyhledává indexovány (předpokládám že všude nepoužíváte klauzuli "Like", která se s indexy nemá moc ráda :-)). Dále bych doporučil nastavit tyto parametry:
SQLiteAdvanced=page_size=4096 (doporučovaná velikost DB stránky)
PRAGMA synchronous=OFF (operace nečekají na zápis na disk)

Co se týče FireDAC komponent:
Pro zvýšení výkonu se doporučuje, pokud je to možné, načíst celou DB do paměti (pomocí TADSQLiteBackup) a pomoct může i komunikace s DB na úrovni API (uADPhysSQLiteWrapper). Více informací naleznete na http://docs.embarcadero.com/products/rad_studio/firedac.

Offline Andy

  • Mladík
  • **
  • Příspěvků: 51
  • Karma: 0
Re:Pomale FireDAC/AnyDAC na iOS
« Odpověď #2 kdy: 07-06-2013, 13:02:22 »
Dekuji za odpoved,
stroj a DB jsou stejne co se tyce nastaveni pouzivam vychozi nastaveni.

Co se tyce TADSQLiteBackup tak nacist DB do pameti nevidim problem ale spis mne pak zajima otazka jak resit ulozeni dat do DB kdyz bude v pameti. chapu ze ji rychle prectu a co kdyz mi aplikace spadne tak pocitam ze prijdu o data  coz je zase nepripustne.


Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1083
  • Karma: 38
    • Verze Delphi: 7, 2010
Re:Pomale FireDAC/AnyDAC na iOS
« Odpověď #3 kdy: 07-06-2013, 15:13:06 »
co se tyce ukladani - vhodne je nezapisovat stale, ale treba to proste kazdou minutu ulozit, pokud je to potreba ;)

Offline Andy

  • Mladík
  • **
  • Příspěvků: 51
  • Karma: 0
Re:Pomale FireDAC/AnyDAC na iOS
« Odpověď #4 kdy: 10-06-2013, 06:44:43 »
Tak se priznam ze jsem z toho drobet na vetvi.
zkusil jsem zkopirovat DB do pameti a je to rozdil cca 20 msec.
pritom co je zajimave kdyz ten dotaz provedu 3x po sobe a merim cas tak kazdy dalsi trva o par msec delsi dobu
premyslel jsem jestli by to nemohlo byt tim ze ty udaje vkladam do tabulky a tabulku pritom prohledavam na shodnou polozku ale kdyz jsem to casovani rozkouskoval tak zjistil jsem ze to je opravdu vyberem z DB.
Pritom je tam jen cca 300 polozek takze i pri pouziti LIKE to nemuze te DB delat problemy.
Kdyz jsem pouzil UniDAC tak je to vyrazne rychlejsi ale jelikoz jsem 2 dny predelaval projekt do FireDAC tak uz se mi ho nechce predelavat nazpet.

Edit:
provedl jsem testovani na jednoduchem dotazu
Kód: MySQL [Vybrat]
  1. SELECT * FROM products WHERE ID = 5
a zpomaluje jak UniDac tak FireDAC akorat FireDAC o neco rychleji
tak si rikam jestli to neni spis neco v FM2 protoze v FM1 + UniDAC to litalo stejne rychle jako na PC ...
« Poslední změna: 10-06-2013, 07:59:11 od Andy »

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1765
  • Karma: 72
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Pomale FireDAC/AnyDAC na iOS
« Odpověď #5 kdy: 10-06-2013, 12:11:28 »
Na ten dataset nemas nahodou neco naveseno? Treba grid nebo tak?

Embarcadero MVP - Czech republic

Offline Andy

  • Mladík
  • **
  • Příspěvků: 51
  • Karma: 0
Re:Pomale FireDAC/AnyDAC na iOS
« Odpověď #6 kdy: 10-06-2013, 12:31:29 »
Dataset ani nepouzivam, pouzivam jen Connection a Query.
Vystup sice delam do tabulky ale mereni jsem provedl cca takto
Kód: Delphi [Vybrat]
  1. T := Time;
  2. DBG_MSG:=DBG_MSG+ FormatDateTime('nn:ss:zzz', Time - T)+' | ';
  3. SQLQuery1.Close;
  4. SQLQuery1.SQL.Text:=safeString('SELECT * FROM products WHERE ID = 5');
  5. SQLQuery1.Open;
  6. SQLQuery1.First;
  7. DBG_MSG:=DBG_MSG+ FormatDateTime('nn:ss:zzz', Time - T)+' | ';

Pro urceni zda to brzdi DB nebo jine objekty jsem vytvoril kopii dane DB a na tu jsem napojil jeden Connector s jenou Query.
Takze to nemam ani z vice konektory ani ve vlaknech a presto to brzdi.
Kdyz jsem vybraz polozku 60x tak jsem na 61 cekal 1,5 vteriny a kdyz jsem na tlacitko kliknul treba 3x po sobe (pote co jsem uz mel cca 60 kliku) tak zpracovani tech 3 polozek trva 7 sec.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1853
  • Karma: 87
    • Verze Delphi: D2007, XE3, DX10
Re:Pomale FireDAC/AnyDAC na iOS
« Odpověď #7 kdy: 10-06-2013, 13:25:26 »
Kdyz jsem vybraz polozku 60x tak jsem na 61 cekal 1,5 vteriny a kdyz jsem na tlacitko kliknul treba 3x po sobe (pote co jsem uz mel cca 60 kliku) tak zpracovani tech 3 polozek trva 7 sec.
Je otazka, co se skryva za nepritelem lidu * (nejaky blob, memo aj.), ale ja bych v tve situaci bud spustil profiler a podival se, kde to hnije, nebo bych nejdrive nepouzil query, ale metodu
Kód: Delphi [Vybrat]
  1. Neco := TConnection.ExecSqlScalar('select NECO from PRODUCTS where ID=:ID',[Id]);
kde bych Id generoval random v oboru existujicich ID a zmeril, kolik to trva a pak bych tentych SQL prikaz spoustel pres Query, z nej vytahnul hodnotu pole NECO a to bych za stehjnych podminek taky zmeril. Samozrejme je mozne, ze to bude v obou pripadech srovnatelne.

Offline Andy

  • Mladík
  • **
  • Příspěvků: 51
  • Karma: 0
Re:Pomale FireDAC/AnyDAC na iOS
« Odpověď #8 kdy: 10-06-2013, 18:21:46 »
Tak misto * jsem dal ID,NAME (Int, Varchar200)
pomoci metod a a Query rozdil zanedbatelny

A co se tyce profileru se priznam ze sice umim vyobrazit hromadu statistik ale jaksi nevim co presne bych mel hledat

EDIT:
Tak nasel jsem krkolomne a asi ne uplne hezke reseni ale funguje to i na Query anemusim kvuli tomu menit moc kodu
proste pred

Kód: Delphi [Vybrat]
  1.     T := Time;
  2.     DBG_MSG:=DBG_MSG+ FormatDateTime('nn:ss:zzz', Time - T)+' | ';
  3. // TENTO KOD PRIDAT PRO UVOLNENI
  4.     try
  5.       SQLQuery1.Free;
  6.     finally
  7.       SQLQuery1:= TSQLQuery.Create(Self);
  8.       SQLQuery1.SQLConnection:=SQLConn; // pripadne Provider nebo Driver podle toho zda UniDAC nebo FireDAC
  9.     end;
  10. // KONEC KODU  PRO UVOLNENI
  11.     SQLQuery1.Close;
  12.     SQLQuery1.SQL.Text:=safeString('SELECT * FROM products WHERE ID = 5');
  13.     SQLQuery1.Open;
  14.     SQLQuery1.First;
  15.     DBG_MSG:=DBG_MSG+ FormatDateTime('nn:ss:zzz', Time - T)+' | ';

proste odstranim a znova vytvorim objekt a dotaz se spousti stejne rychle jako poprve.
kdyby vsaknekoho na zaklade techto poznatku napadlo neco rozumnejsiho budu jedine rad
« Poslední změna: 10-06-2013, 18:49:32 od Andy »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1853
  • Karma: 87
    • Verze Delphi: D2007, XE3, DX10
Re:Pomale FireDAC/AnyDAC na iOS
« Odpověď #9 kdy: 10-06-2013, 19:13:54 »
Tak misto * jsem dal ID,NAME (Int, Varchar200)
pomoci metod a a Query rozdil zanedbatelny
Slo mi o to, jestli neexistuje nejaky overhead napr. s parsovanim metadat na strane vlastniho datasetu tj. TADQuery oproti tomu, kdyz to nechas vykonat primo. Je-li to shodne a vyrazne horsi oproti UniDAC, tak by to melo byt na strane fyzickeho driveru SQLite.

Sice uz nekolik tydnu predelavam pomerne rozsahlou rodinu produktu z FIB+ na FireDac, takze o kompatibilite FIB <-> FireDac leccos vim, SQLite jako takovou jsem dlouha leta pouzival s vlastnim ORM, ale zrovna SQLite me ve vazbe na FireDac vubec nezajima, takze jsem ji ani nezkousel ani necetl v dox a tudiz o tom nic nevim.

Citace
A co se tyce profileru se priznam ze sice umim vyobrazit hromadu statistik ale jaksi nevim co presne bych mel hledat
Pro zakladni orientaci by ti melo stacit si report setridit podle sloupce Time treba sestupne a hledat funkce, ktere patri do FireDac a jejichz Hit Count koreluje s poctem opakovani testovaneho selectu a zaberou nejvic casu. V prvni fazi bez ohledu na share time, v dalsi fazi routiny, ktere maji vysoky share time.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1853
  • Karma: 87
    • Verze Delphi: D2007, XE3, DX10
Re:Pomale FireDAC/AnyDAC na iOS
« Odpověď #10 kdy: 10-06-2013, 19:18:54 »
    SQLQuery1:= TSQLQuery.Create(Self);
    SQLQuery1.SQLConnection:=SQLConn;
To TSQLQuery je nejaky tvuj potomek TADQuery?

Offline Andy

  • Mladík
  • **
  • Příspěvků: 51
  • Karma: 0
Re:Pomale FireDAC/AnyDAC na iOS
« Odpověď #11 kdy: 10-06-2013, 20:28:10 »
    SQLQuery1:= TSQLQuery.Create(Self);
    SQLQuery1.SQLConnection:=SQLConn;
To TSQLQuery je nejaky tvuj potomek TADQuery?
To je standartni komponenta z zalozky dbExpress na Firedac jsem to pouzil stejne. Jen jsem sem vykopiroval dbExpress misto FiredAC

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: