[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