Databáze > Obecné

Extrémne pomalé načítanie záznamov do TMSFMXGrid cez LiveBindings

(1/2) > >>

cervenka44:
Dobrý deň,

Potreboval by som poradiť s nasledujúcim problémom. Nikde som totiž nenašiel riešenie.
K zakúpenému Delphi XE3 som dostal ako bonus komponentu TMSFMXGrid ktorá funguje iba pod FMX s LiveBindings.
Mám vytvorenú databázu malého informačného systému na db PostgreSQL.
Na pripojenie k databáze používam komponenty FireDAC.

V FMX aplikácii mi to funguje takto:
Pripájam sa cez komponenty ADConnection, ADTable, BindSourceDB na TMSFMXGrid.
Načítanie 18700 riadkov so 41 stĺpcami trvá približne 10 minút , čo je prakticky nepoužiteľné.
Maximálna dĺžka riadka je iba 270 znakov.

Vo VCL aplkácii sa to správa rovnako za predpokladu že použijem namiesto TMSFMXGrid StringGrid.
Takže TMSFMXGrid asi nie je problém.

Ak ale vo VCL použijem kombináciu komponentov ADConnection, ADTable, DataSource a DBGrid, načítanie dát je okamžité - menej ako 1 sekunda. Pritom sa pripájam na tú istú tabuľku

Popis takéhoto problému som našiel na http://stackoverflow.com/questions/8574326/firemonkey-and-livebindings-performance-with-databases avšak žiadne zmysluplné riešenie.

Potrebujem bežne pracovať s viac ako 100 000 riadkami a vlastnosti TMSFMXGrid mi úplne vyhovujú.

Vedel by niekto poradiť ako sa vysporiadať s týmto problémom ?


Ďakujem




zdenek:
Tms grid není zrovna rychlý, taky by chtěl zrychlit, ale tohle je problém livebindings.

Mě to nepřekvapilo, protože livebinding považuji za úplný úlet. Především pro práci s DB. Na rozdíl od TDataSource a spol. Datasource předává data přes hodnoty, zatímco livebindings všechno (dle mého názoru) parsuje jako výrazy, protože lze kamkoliv napsat vzorec. Navíc to ve výsledku skončí jako text. On neprůhlednosti refresh hodnot mezi komponentami ani nemluvě.

Pro profi aplikace na PC naprosto nepoužitelné. Na mobilních zařízení se snažíme vyhnout takovému stavu postupným filtrováním.

Moc jsem Vám asi nepomohl.

mjseven:
Je opravdu nutné tahat tolik záznamů najednou? V reálu vidí uživatel na monitoru jen desítky řádků.
Data která se z DB čtou jsou z jedné tabulky nebo jde o data z více tabulek?

Mi.Chal.:

--- Citace: cervenka44  05-12-2013, 14:31:07 ---Ak ale vo VCL použijem kombináciu komponentov ADConnection, ADTable, DataSource a DBGrid, načítanie dát je okamžité - menej ako 1 sekunda. Pritom sa pripájam na tú istú tabuľku

--- Konce citace ---

Záleží na implementaci, ty standardní datasety to mohou načítat kurzorem postupně, takže se z db nemusí přenést všechno a data se dotahují jak se posouváš. Pokud něco čeká na načtení všeho, tak to bude pomalejší.

Jak už tu ale psali, normální je data filtrovat a načítat jenom to, co opravdu zobrazíš. Je blbost načítat desetitisíce řádků, když se jich na monitor vejde pár desítek. Až člověk dojede na konec seznamu, tak můžeš dotáhnout další část. Třeba v gmailu mám několik desítek tisíc mailů, kdyby se to mělo všechno zobrazit najednou, tak to bude načítat taky několik minut místo pár vteřin.

cervenka44:
Predovšetkým ďakujem za reakcie.

Ak je to teda realita čo tvrdí Zdenek, som z toho "trochu" sklamaný.

Naozaj nie je nutné vždy ťahať velké množstvo záznamov, ale aj načítanie 1000 riadkov v tomto prípade trvá okolo 40 sekúnd. Zo skúsenosti v našej firme viem že ak naši používatelia majú čakať na načítavanie dát čo len 30-40 sekúnd, sú z toho nervózni. A takých situáciíí napr. pri generovaní záznamov pre výrobu majú denne aj 20-30.

Na porovnanie by som chcel uviesť, že mám vytvorenú aplikáciu vo VFP 9 ktorou sa pripájam na podnikový informačný systém bežiaci na INFORMIXe. Ťahám z nej cez ODBC napr. dáta poskladané z 5 tabuliek ktorých výsledkom je sada 260 000 záznamov (účtovné transakcie za celý 1 rok) s 23 stĺpcami a to všetko za 25 sekúnd. Je mi jasné, že pokiaľ sa jedna časť údajov zobrazuje, ďalšia sa ešte načítava. Ale v tomto prípade sa viem dostať na koniec sady dát alebo na hociktorý záznam v gride okamžite. Filtrovanie údajov napr. účet alebo obdobie potom riešim samostanou procedúrou cez pravé tlačidlo myši na hociktorom stĺpci ktorý potrebujem filtrovať a nemusím neustále ťahať záznamy zo servera ak chcem požiť aj rôzne kombinácie filtrovaných údajov . Všetko to beží veľmi rýchlo, takže sa ani nejako nezaoberám počtom ťahaných záznamov, samozrejme ale na prvotné filtrovanie používam zmysluplný výber.

Hlavný problém v mojom prípade je ale ten, že keď spustím načítanie tých 18700 záznamov (čo myslím nie je až tak veľký objem) celá aplikácia sa na 10 minút zasekne a začne reagovať až po načítaní všetkých riadkov. Neviem ovplyvniť že pokiaľ sa 1 časť dát zobrazuje a ďalšie dáta sa načítavajú aby aplikácia normálne fungovala. Je to takto naozaj nepoužiteľné.

Obmedzil som na skúšku v TMS Grid pod LiveBindigs vlastnosť BufferCount=1000. Takto bola aplikácia zaseknutá asi 40 sekúnd. Je to časovo porovnateľné k tým 18700 záznamom. Nič to nerieši.
Skúsil som ešte načítať do TMS Grid XLS  súbor o 31 000 riadkoch a 28 stĺpcoch (každý záznam 280 znakov). Načítanie prebehlo za 6 sekúnd. Celkom slušné, aj keď mi práve toto nepomôže.
Takže predsa asi to má na svedomí LiveBindings. Tiež som mal taký prvotný pocit, ale nemal som s tým žiadnu skúsenosť.

Pokiaľ by predsa len existovalo nejaké riešenie, privítam každú užitočnú radu.



Navigace

[0] Seznam témat

[#] Další strana

Přejít na plnou verzi