yform icon indicating copy to clipboard operation
yform copied to clipboard

`importTablesets` Ist langsam

Open staabm opened this issue 3 years ago • 4 comments

Lt meldung im slack dauert das importieren mehrerer sets über 1min20. D.h. Dem timelimit

Ggf sollte geprüft werden ob batch inserts/updates möglich sind, oder andere perf low hanging fruits abgeholt werden können

beispiel install.php aus slack

        $articlesTableset = \rex_file::get(`articles.json`);
        \rex_yform_manager_table_api::importTablesets($articlesTableset);

beispiel datei: https://files.slack.com/files-pri/T1BCPLXEE-F03Q753QB3J/articles.json

staabm avatar Jul 14 '22 12:07 staabm

Danke Markus!

Ergänzend hier noch die Infos aus dem Log:

Fatal error Maximum execution time of 300 seconds exceeded redaxo\src\addons\yform\plugins\manager\lib\yform\manager\table\api.php 637
Fatal error Maximum execution time of 300 seconds exceeded redaxo\src\core\lib\sql\sql.php 455

und der Link zu Slack, mit mehr Infos sofern nötig https://friendsofredaxo.slack.com/archives/C1BAXLN2F/p1657798329250209

madiko avatar Jul 14 '22 13:07 madiko

vermutung: hier passiert 1 sql UPDATE pro field das importiert wird: https://github.com/yakamara/redaxo_yform/blob/69997f12a3e0fb3fc7aba136d6cfea9c3df3b6a6/plugins/manager/lib/yform/manager/table/api.php#L201-L228

ich denke, wenn man nen unique key auf die yform_field tabelle hätte, könnte man mittels rex_sql mit batch-updates arbeiten..?

staabm avatar Jul 14 '22 16:07 staabm

Mal etwas beim Schreiben gedacht oder umgekehrt: Beim ersten mal "importTableset" fand ich die Idee gut, mit einem Statement sowohl den Tableset anzulegen als auch die Tabelle selbst. Mittlerweile sehe ich das anders. Da ein Tableset auch einfach ein Subset einer Tabelle sein, sehe ich "Tabelle anlegen" und "Tableset einspielen" tatsächlich als zwei Aktionen. Und wenn "importTableset" sicherstellt, dass evtl fehlende Teile in der DB angelegt werden, ist das eher Rettungsring denn Feature.

Wobei ImportTableset ja nicht nur einfach ein paar Sätze in die rex_yform_field einspielt und die Felder in der Datentabelle sicherstellt. In rex_yform_field müssen ja evtl auch neue Spalten eingefügt werden. Die Konfigurationsseite für ein Formularfeld braucht ja auch n Spalten, um ihre Parameter zu diesem Feld abzulegen. Wenn hier im Tableset also bisher nicht genutzte Feldtypen auftauchen, wird auch rex_yform_field erweitert. Es ist nicht so einfach.

Wobei - das muss ich natürlich dazusagen - YForm insgesamt schon so komplex ist, dass ich bei vielen Feinheiten nicht durchblicke. Was nicht bedeutet, dass man das eine oder andere nicht performanter machen könnte. Just my 2 cent.

christophboecker avatar Jul 14 '22 18:07 christophboecker

ich denke das hauptproblem besteht darin, dass beim import n-fields mit n-sql queries angelegt werden. d.h. je mehr felder eine tabelle hat, je langsamer wirds. wenn man aber die fields mit einem multi-row update/insert machen würde, wäre die performance damit unabhängig von der anzahl der felder innerhalb eines tablesets

@dergel wäre ein unique index in yform_field(table_name, name) denkbar?

staabm avatar Jul 15 '22 07:07 staabm

Der Unique Index müsste mehrere Felder haben. Die Probleme laut Blackfire sind vielfältig. Beim YCom Import sind ein paar Dinge im YCom AddOn bereits angepasst und in der YForm habe ich das Grobe auch durch. Pi mal Daumen haben die Änderungen um den Faktor 6 die Zeit verkürzt.

Hier gehts weiter. https://github.com/yakamara/redaxo_yform/issues/1326

dergel avatar Feb 28 '23 15:02 dergel