Autor Téma: SQLite Update nefunguje  (Přečteno 4050 krát)

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1744
  • Karma: 67
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQLite Update nefunguje
« Odpověď #30 kdy: 19-03-2018, 20:46:38 »
..
Tady je low level varianta s cistenim rowsetu (ktery ma velikost podle velikosti davky). Funguje to jednoduse, pomoci SrcCmd opakovane tahas packety dat (rowsety) z DBMS, a dokud obsahuji alespon jeden zaznam, naplni se pole parametru a pomoci DstCmd se odesle davka:
..
Tak v tejto verzii som na 15.4, 15.1, 15.3, niekedy na 16-tich sekundách. To je zlepšenie o viac ako sekundu, oproti FDQuery.
Najlepšie je to, že využitie Memory nebolo v tomto prípade nikdy viac, ako 55 MB.
V predošlých prípadoch to bolo na cca 690 MB. (LowLevel v1 a verzia s FDQuery)
Low level v2 je jasný víťaz. Ďakujem :)

Porovnanie:
  • FDQuery         16.9  - 18 sek      697  MB RAM MAX
  • Low level v1    18    -  20 sek      690  MB RAM MAX
  • Low level v2    15.1 -  15.6 sek     55  MB RAM MAX

Vyuziti pameti u Tveho query objektu muzes zredukovat napr. nastavenim Unidirectional na True. Kurzorem v takovem pripade muzes do jeho znovuotevreni pohybovat jen smerem vpred, ne zpet. FireDAC tak muze ze storage zahazovat zaznamy kterymi prosel kurzor (stejne jako u sebe cistim po zpracovani rowset, storage u me vsak neni "propojena" s dataset objektem, proto to delam manualne).

Mozna se dostanes na podobny cas. Query objekt vsak interne pouziva stejny low level interface, jen pred jeho pouzitim testuje stavy a vyvolava udalosti (jako BeforeExecute, apod.), takze ten low level interface bude teoreticky rychlejsi (zkratka proto ze se spousti mene kodu). Stejne jako pristup k datum ne pomoci presouvani kurzoru, ale primym vyuzitim storage (kdyz stejny storage interne pouziva napr. i query objekt, jen se pro data chodi pres interface TDataSet, cili query objekt ve Tvem projektu opet potrebuje spustit vice kodu).
« Poslední změna: 19-03-2018, 20:54:15 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Online miroB

  • Hrdina
  • ****
  • Příspěvků: 444
  • Karma: 16
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite Update nefunguje
« Odpověď #31 kdy: 19-03-2018, 21:04:59 »
Áno potvrdené.
qs.FetchOptions.Unidirectional := True;
Pamäť ako u low level v2. Zlepšila sa aj rýchlosť.
Viacmenej sa s takto upraveným FDQuery veľmi približujeme LL v2.

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1744
  • Karma: 67
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQLite Update nefunguje
« Odpověď #32 kdy: 19-03-2018, 22:03:40 »
Áno potvrdené.
qs.FetchOptions.Unidirectional := True;
Pamäť ako u low level v2. Zlepšila sa aj rýchlosť.
Viacmenej sa s takto upraveným FDQuery veľmi približujeme LL v2.

Vicemene ano. Jeste muzes zkusit pro cteci query objekt zvednout hodnotu FetchOptions.RowsetSize na stejnou jakou bude mit davka (jde v podstate o to, abys FireDAC prinutil prenaset stejny pocet zaznamu jako se ma zpracovat v davce; pokud je to mozne). U SQLite jde u FetchOptions.RowsetSize o emulaci, coz je de-facto smycka volajici sqlite3_step (cekajici na patricny vysledek), takze se nemusis bat vysokych hodnot. Kdyz pak budes skrolovat kurzorem (pomoci Next), a mines posledni zaznam v resultsetu, prenese se jich v dalsi cteci davce prave tolik.

U RDBMS nativne podporujicich rowset fetching vsak muze byt tato hodnota vliv na zmenu vykonu.
« Poslední změna: 19-03-2018, 22:10:51 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Online miroB

  • Hrdina
  • ****
  • Příspěvků: 444
  • Karma: 16
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite Update nefunguje
« Odpověď #33 kdy: 20-03-2018, 11:06:28 »
.. Jeste muzes zkusit pro cteci query objekt zvednout hodnotu FetchOptions.RowsetSize na stejnou jakou bude mit davka (jde v podstate o to, abys FireDAC prinutil prenaset stejny pocet zaznamu jako se ma zpracovat v davce; pokud je to mozne). U SQLite jde u FetchOptions.RowsetSize o emulaci, coz je de-facto smycka volajici sqlite3_step (cekajici na patricny vysledek), takze se nemusis bat vysokych hodnot. Kdyz pak budes skrolovat kurzorem (pomoci Next), a mines posledni zaznam v resultsetu, prenese se jich v dalsi cteci davce prave tolik.

U RDBMS nativne podporujicich rowset fetching vsak muze byt tato hodnota vliv na zmenu vykonu.
V tomto prípade sa nedali zaznamenať signifikantné rozdiely v dosiahnutých časoch.

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1744
  • Karma: 67
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQLite Update nefunguje
« Odpověď #34 kdy: 20-03-2018, 11:15:36 »
.. Jeste muzes zkusit pro cteci query objekt zvednout hodnotu FetchOptions.RowsetSize na stejnou jakou bude mit davka (jde v podstate o to, abys FireDAC prinutil prenaset stejny pocet zaznamu jako se ma zpracovat v davce; pokud je to mozne). U SQLite jde u FetchOptions.RowsetSize o emulaci, coz je de-facto smycka volajici sqlite3_step (cekajici na patricny vysledek), takze se nemusis bat vysokych hodnot. Kdyz pak budes skrolovat kurzorem (pomoci Next), a mines posledni zaznam v resultsetu, prenese se jich v dalsi cteci davce prave tolik.

U RDBMS nativne podporujicich rowset fetching vsak muze byt tato hodnota vliv na zmenu vykonu.
V tomto prípade sa nedali zaznamenať signifikantné rozdiely v dosiahnutých časoch.

To je mozne. Teorie vsak hovori jasne :) S query objektem spoustis jen kod navic - interne vyuziva stejny low level interface, a stejny storage (jen mezi tim probihaji napr. ruzne kontroly stavu objektu, posun kurzoru, a vyvolavaji se udalosti).
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Online miroB

  • Hrdina
  • ****
  • Příspěvků: 444
  • Karma: 16
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite Update nefunguje
« Odpověď #35 kdy: 21-03-2018, 22:39:32 »
Mal by som otázku.
Ak pribudne prvá odpoveď založím príslušné nové vlákno.
V princípe sa v tomto vlákne preberalo UPDATE na báze riadiaceho query (select).
Bolo by v SQLite rovnako možné/bezpečné riadiacim Query, tiež mazať riadky v dotknutej tabuľke?
Nie zapisovať, ale mazať. Ďakujem

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4171
  • Karma: 37
    • Verze Delphi: XE7 professional
Re:SQLite Update nefunguje
« Odpověď #36 kdy: 22-03-2018, 08:15:25 »
Ja v tom principiálne žiaden rozdiel nevidím.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.