yform
yform copied to clipboard
`importTablesets` Ist langsam
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
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
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..?
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.
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?
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