[vz-dev] s0vz: Überflüssige Updates bei jedem Insert?
Heiko Baumann
hbcs at gmx.de
Sun Jan 12 21:53:37 CET 2014
Hallo zusammen,
beim Installieren der neuen aggregate-Tabelle von Andi bin ich mehr oder
weniger zufällig beim Betrachten der mysql-logs darauf gestoßen, dass
jedes s0-Event neben dem eigentlichen Insert offenbar immer auch einen
join und drei Updates ausführt:
911 Query SELECT e0_.id AS id0, e0_.uuid AS
uuid1, e0_.type AS type2, p1_.id AS id3, p1_.pkey AS pkey4, p1_.value AS
value5, e0_.class AS class6, p1_.entity_id AS entity_id7 FROM entities
e0_ LEFT JOIN properties p1_ ON e0_.id = p1_.entity_id WHERE (e0_.uuid =
'90da22c0-f2dc-11e2-a59d-e9b55d71b128') AND e0_.class IN ('channel',
'aggregator') ORDER BY p1_.pkey ASC
911 Query START TRANSACTION
911 Query INSERT INTO data (timestamp, value,
channel_id) VALUES ('1389302896063', '1', 14)
911 Query UPDATE properties SET value = '1' WHERE
id = 71
911 Query UPDATE properties SET value = '1' WHERE
id = 69
911 Query UPDATE properties SET value = '1000'
WHERE id = 67
911 Query commit
Das ist offenbar ein s0-Eintrag (value=1 im channel 14, Stromzähler).
Was mich wundert: warum muss der aufwändige join vorher ausgeführt
werden? Liefert bei mir z.B.
+-----+--------------------------------------+-------+------+------------+---------------------+---------+------------+
| id0 | uuid1 | type2 | id3 | pkey4
| value5 | class6 | entity_id7 |
+-----+--------------------------------------+-------+------+------------+---------------------+---------+------------+
| 14 | 90da22c0-f2dc-11e2-a59d-e9b55d71b128 | power | 71 | active
| 1 | channel | 14 |
| 14 | 90da22c0-f2dc-11e2-a59d-e9b55d71b128 | power | 70 | color
| navy | channel | 14 |
| 14 | 90da22c0-f2dc-11e2-a59d-e9b55d71b128 | power | 69 | public
| 1 | channel | 14 |
| 14 | 90da22c0-f2dc-11e2-a59d-e9b55d71b128 | power | 67 | resolution
| 1000 | channel | 14 |
| 14 | 90da22c0-f2dc-11e2-a59d-e9b55d71b128 | power | 72 | style
| steps | channel | 14 |
| 14 | 90da22c0-f2dc-11e2-a59d-e9b55d71b128 | power | 68 | title
| Strom-Ferienwohnung | channel | 14 |
+-----+--------------------------------------+-------+------+------------+---------------------+---------+------------+
6 rows in set (0.00 sec)
Muss das wirklich vor jedem Insert sein? Andi hat sich im Originalthread
ja schon dazu geäußert:
"Den Join braucht Doctrine, das scheint auch mit Query Cache nicht weg
optimierbar zu sein da es immer einen aktuellen Stand aus der DB haben
will, die Abfrage ist auch schnell."
Ok, soll mir recht sein.
Aber danach werden _immer_ die Werte für resolution, active und public
"geupdatet" (Unnötig, sind die alten Werte)
-> das sind drei sinnlose Updates pro s0-insert.
Da die s0-Stromzähler ja mitunter heftig feuern (Wärmepumpe unter Last
4kWh, PV-Wechselsrichter gern auch mal 12kWh, zudem zwei
Geschoss-Stromzähler), könnt ich mir vorstellen, dass das ziemlich viel
unnötige Queries auslöst. Da kommt insgesamt schon einiges zusammen -
und wenn zu jedem Insert eines neuen Werts drei überflüssige Updates
kommen, ist mir klar, warum meine kleine Kiste etwas schwächelt...
Frage deswegen: Ist die Problematik bekannt? Kann das optimiert werden?
Vielen Dank und schöne Grüße!
Heiko
More information about the volkszaehler-dev
mailing list