Google Export

Seit ich neue Artikel in meinen Shop (per Improter) eingefügt habe schafft der Shop den Produktexport zu Google nicht mehr. Folgender SQL Befehl legt für ca. 30 Minuten (wenn ich ihn nicht abbreche) den Server lahm (Load Average liegt bei ca. 20)… Im Google Merchant-Center zeigt er dann einen Übertragsunsfehler an. SELECT a.id AS `articleID` , a.name, a.description, a.description\_long, d.shippingtime, d.shippingfree, a.topseller, a.keywords, d.minpurchase, d.purchasesteps, d.maxpurchase, d.purchaseunit, d.referenceunit, a.taxID, a.supplierID, d.unitID, IF( a.changetime != '0000-00-00 00:00:00', a.changetime, '' ) AS `changed` , IF( a.datum != '0000-00-00', a.datum, '' ) AS `added` , IF( d.releasedate != '0000-00-00', d.releasedate, '' ) AS `releasedate` , a.active AS active, d.id AS `articledetailsID` , IF( v.ordernumber IS NOT NULL , v.ordernumber, d.ordernumber ) AS ordernumber, d.suppliernumber, d.ean, d.width, d.height, d.length, d.kind, IF( v.standard =1 || kind =1, 1, 0 ) AS standard, d.additionaltext, d.impressions, d.sales, IF( v.active IS NOT NULL , IF( a.active =0, 0, v.active ) , a.active ) AS active, IF( v.instock IS NOT NULL , v.instock, d.instock ) AS instock, ( SELECT AVG( av.points ) FROM s\_articles\_vote AS av WHERE active =1 AND articleID = a.id ) AS sVoteAverage, ( SELECT COUNT( \* ) FROM s\_articles\_vote AS av WHERE active =1 AND articleID = a.id ) AS sVoteCount, d.stockmin, d.weight, d.position, at.attr1, at.attr2, at.attr3, at.attr4, at.attr5, at.attr6, at.attr7, at.attr8, at.attr9, at.attr10, at.attr11, at.attr12, at.attr13, at.attr14, at.attr15, at.attr16, at.attr17, at.attr18, at.attr19, at.attr20, s.name AS supplier, u.unit, u.description AS unit\_description, t.tax, CONCAT( i.img, '.', i.extension ) AS image, a.configurator\_set\_id AS configurator, ROUND( IFNULL( gp.price, p.price ) \* ( 100 - IF( pd.discount, pd.discount, 0 ) -0 ) /100 \*1, 2 ) AS netprice, ROUND( IFNULL( gp.price, p.price ) \* ( 100 + t.tax ) /100 \* ( 100 - IF( pd.discount, pd.discount, 0 ) -0 ) /100 \*1, 2 ) AS price, pd.discount, ROUND( p.pseudoprice \*1, 2 ) AS netpseudoprice, ROUND( p.pseudoprice \* ( 100 + t.tax ) \*1 /100, 2 ) AS pseudoprice, p.baseprice, IF( FILE IS NULL , 0, 1 ) AS esd, NULL AS configurator\_settings, IF( COUNT( d.ordernumber ) \<=1, '', GROUP\_CONCAT( CONCAT( '"', REPLACE( d.ordernumber, '"', '""' ) , '"' ) SEPARATOR ';' ) ) AS group\_ordernumber, IF( COUNT( d.additionaltext ) \<=1, '', GROUP\_CONCAT( CONCAT( '"', REPLACE( d.additionaltext, '"', '""' ) , '"' ) SEPARATOR ';' ) ) AS group\_additionaltext, IF( COUNT( p.price ) \<=1, '', GROUP\_CONCAT( ROUND( p.price \* ( 100 - IF( pd.discount, pd.discount, 0 ) -0 ) /100 \*1, 2 ) SEPARATOR ';' ) ) AS group\_pricenet, IF( COUNT( p.price ) \<=1, '', GROUP\_CONCAT( ROUND( p.price \* ( 100 + t.tax - IF( pd.discount, pd.discount, 0 ) -0 ) /100 \*1, 2 ) SEPARATOR ';' ) ) AS group\_price, IF( COUNT( d.active ) \<=1, '', GROUP\_CONCAT( d.active SEPARATOR ';' ) ) AS group\_active, IF( COUNT( d.instock ) \<=1, '', GROUP\_CONCAT( d.instock SEPARATOR ';' ) ) AS group\_instock FROM s\_articles a INNER JOIN s\_articles\_details d ON d.articleID = a.id LEFT JOIN s\_articles\_attributes at ON d.id = at.articledetailsID LEFT JOIN `s_core_units` AS `u` ON d.unitID = u.id LEFT JOIN `s_core_tax` AS `t` ON a.taxID = t.id LEFT JOIN `s_articles_supplier` AS `s` ON a.supplierID = s.id LEFT JOIN s\_core\_pricegroups\_discounts pd ON a.pricegroupActive =1 AND a.pricegroupID = groupID AND customergroupID =1 AND discountstart =1 LEFT JOIN s\_articles\_esd e ON e.articledetailsID = d.id LEFT JOIN ( SELECT articleID FROM s\_export\_categories AS ec, s\_articles\_categories AS ac WHERE feedID =15 AND ec.categoryID = ac.categoryID GROUP BY articleID ) AS bc ON bc.articleID = a.id LEFT JOIN s\_export\_suppliers AS bs ON ( bs.supplierID = s.id AND bs.feedID =15 ) LEFT JOIN s\_export\_articles AS ba ON ( ba.articleID = a.id AND ba.feedID =15 ) LEFT JOIN s\_articles\_prices AS p ON p.articledetailsID = d.id AND p.`from` =1 AND p.pricegroup = 'EK' JOIN s\_categories c ON c.id =8 LEFT JOIN s\_categories c2 ON c2.left \> c.left AND c2.right \<= c.right JOIN s\_articles\_categories act ON act.articleID = a.id AND ( act.categoryID = c.id OR act.categoryID = c2.id ) LEFT JOIN s\_articles\_img AS i ON i.articleID = a.id AND i.main =1 AND i.article\_detail\_id IS NULL JOIN ( SELECT NULL AS `articleID` , NULL AS `valueID` , NULL AS `attr1` , NULL AS `attr2` , NULL AS `attr3` , NULL AS `attr4` , NULL AS `attr5` , NULL AS `attr6` , NULL AS `attr7` , NULL AS `attr8` , NULL AS `attr9` , NULL AS `attr10` , NULL AS `standard` , NULL AS `active` , NULL AS `ordernumber` , NULL AS `instock` ) AS v JOIN ( SELECT NULL AS articleID, NULL AS valueID, NULL AS groupkey, NULL AS price, NULL AS optionID ) AS gp WHERE bc.articleID IS NULL AND bs.supplierID IS NULL AND a.mode =0 AND d.kind !=3 AND ba.articleID IS NULL AND ( v.active =1 OR ( v.active IS NULL AND a.active =1 ) ) GROUP BY ( a.id )

wieviele artikel? Zeige Datensätze 0 - 29 (566 insgesamt, die Abfrage dauerte 17.4472 sek.)

Als ehemaliger Server-Admin kenn ich mich noch ein bissl aus und habe den SQL Befehl gerade mal mit vorrangestelltem EXPLAIN ausgeführt und erhalte da folgende Infos (soweit ich mich erinnere ist “Using temporary; Using filesort” in Zeile 1 das Problem, was die Laufzeit angeht)… Ich bekomme leider kein Ergebnis, kann aber sagen, dass ich 1440 Artikel habe, die alle Varianten-Artikel sind. Zu 99% gibt es nur eine Option mit 10-30 Auswahlmöglichkeiten. Der Export zu Google beinhaltet allerdings keine Varianten, sondern jeweils nur den Haupt-Artikel. Was mich auch sichtlich verwundert ist, dass dieser SQL Befehl es schafft 16 GB Ram vollzuklatschen (mein Server -> siehe Signatur), wo die Datenbank insgesamt gerade mal knapp 60 MB hat. id select\_type table type possible\_keys key key\_len ref rows Extra 1 PRIMARY <derived5> system NULL NULL NULL NULL 1 Using temporary; Using filesort 1 PRIMARY <derived6> system NULL NULL NULL NULL 1 1 PRIMARY c const PRIMARY PRIMARY 4 const 1 1 PRIMARY a ALL PRIMARY NULL NULL NULL 1546 Using where 1 PRIMARY d ref articleID articleID 4 uf_shopware.a.id 14 Using where 1 PRIMARY at ref articledetailsID articledetailsID 5 uf_shopware.d.id 1 1 PRIMARY u eq_ref PRIMARY PRIMARY 4 uf_shopware.d.unitID 1 1 PRIMARY t eq_ref PRIMARY PRIMARY 4 uf_shopware.a.taxID 1 1 PRIMARY s eq_ref PRIMARY PRIMARY 4 uf_shopware.a.supplierID 1 1 PRIMARY pd eq_ref groupID groupID 16 uf_shopware.a.pricegroupID,const,const 1 1 PRIMARY e ref articledetailsID articledetailsID 4 uf_shopware.d.id 1 1 PRIMARY <derived4> ALL NULL NULL NULL NULL 22 Using where; Not exists 1 PRIMARY bs eq_ref PRIMARY PRIMARY 8 const,uf_shopware.s.id 1 Using where; Using index; Not exists 1 PRIMARY ba eq_ref PRIMARY PRIMARY 8 const,uf_shopware.a.id 1 Using where; Using index; Not exists 1 PRIMARY i ref artikel_id,article_detail_id artikel_id 5 uf_shopware.a.id 1 1 PRIMARY act ref articleID,categoryID,articleID_2 articleID 4 uf_shopware.a.id 1 Using index 1 PRIMARY p ref articledetailsID,pricegroup_2,pricegroup articledetailsID 4 uf_shopware.d.id 1 1 PRIMARY c2 range left left 4 NULL 18 Using where; Using index 6 DERIVED NULL NULL NULL NULL NULL NULL NULL No tables used 5 DERIVED NULL NULL NULL NULL NULL NULL NULL No tables used 4 DERIVED ec ref PRIMARY PRIMARY 4 4 Using index; Using temporary; Using filesort 4 DERIVED ac ref categoryID categoryID 4 uf_shopware.ec.categoryID 115 Using where 3 DEPENDENT SUBQUERY av ref articleID articleID 4 func 1 Using where 2 DEPENDENT SUBQUERY av ref articleID articleID 4 func 1 Using where

dann stimmt deine my.cnf nicht schick mal per pm wenn es geht bzw. dort kann ich dir meien email geben. bei mir war es ein müdes lächeln vom server und dann hat er es ausgespuckt.

1 „Gefällt mir“

Ja das war es bei mir bei 800 Artikeln auch noch. PM kommt…

bei unseren 24.000 Artikeln funktionierte der Export gar nicht mehr. Zwar war der Shop noch erreichbar aber das Script lief nahezu unendlich lang. Wir haben dann einfach ein Cronjob Plugin geschrieben welches unsere Artikel genau nach unseren Vorgaben selektiert und per FTP an Google überträgt - FTP musste verwendet werden da das Feed mehr als 15MB groß ist. Die Shopware standard Funktion “Produkt-Exporte” kann diesen Weg über FTP sowieso nicht - darum an alle die das Problem haben evtl. auch diesen Weg einschlagen dann ist man Safe :wink: Fazit: Selektierung der Daten und Übertragung auf den Google FTP dauert nun nur noch 10sec

[quote=„kotoradeluxe“]Wir haben dann einfach ein Cronjob Plugin geschrieben welches unsere Artikel genau nach unseren Vorgaben selektiert und per FTP an Google überträgt[/quote] Würdet ihr dieses Plugin weitergeben? Wenn ja: Preis? Oder wie wärs mit Anbieten im Shopware Store? Angebot gerne per PN. Danke!

also das Plugin ist zwar nach Shopware Guidelines Programmiert und Updatesicher. Es gibt nur 2 Sachen die wir anpassen müssten. [list] [*] aktuell stehen die Zugangsdaten zum Google FTP direkt im Quellcode das müssten wir in eine Plugin Konfig verschieben (kein Problem)[/*] [*] Das Feed welches erzeugt wird passt wahrscheinlich nur auf unsere Umgebung - sprich da müsste man das nochmal für jede Shopware Umgebung anpassen - das ist aber nicht wirklich so einfach dass das jeder Händler selbst lösen kann.[/*][/list] Das Problem bei den Shopware Produktexporten ist einfach dass es weitestgehend für alle Kunden passen muss - darum die Komplexität und das wiederum ist das Problem mit den Ladezeiten des Feeds. Eine exakte Zieldefinition wie in unserem Modul ist klar viel viel Schneller. Ich sehe da aktuell noch das Problem wie Ihr das als Händler selbst anpassen könnt - im Endeffekt wird es darauf hinaus laufen dass ich das für euch anpassen muss. Aus diesem Grund fällt das anbieten im Shopware Store erstmal weg. Könntest Du mir einen kurzen Umriss geben welche Artikel Du in deinem Shop hast: [list] [*] Anzahl Varianten Artikel[/*] [*] Sonstige Artikel[/*] [*] Wenn Varianten dann eindimensional, mehrdimensional oder mit Aufpreis[/*] [*] Werden nur die Hauptartikel zu Google übermittelt oder jede einzelne Variante[/*][/list] Der Rest ist kein Problem nur da hat jeder Händler was anderes eingestellt :stuck_out_tongue:

[quote=“kotoradeluxe”]Ich sehe da aktuell noch das Problem wie Ihr das als Händler selbst anpassen könnt - im Endeffekt wird es darauf hinaus laufen dass ich das für euch anpassen muss.[/quote] Aso bei mir seh ich da weniger das Problem, da ich selbst seit 14 Jahren PHP entwickle und auch mit Shopware schon etwas Plugin Erfahrung habe. [quote=“kotoradeluxe”]Könntest Du mir einen kurzen Umriss geben welche Artikel Du in deinem Shop hast: [list] [*] Anzahl Varianten Artikel[/*] [*] Sonstige Artikel[/*] [*] Wenn Varianten dann eindimensional, mehrdimensional oder mit Aufpreis[/*] [*] Werden nur die Hauptartikel zu Google übermittelt oder jede einzelne Variante[/*][/list] [/quote] * Anzahl Varianten-Artikel -> Ist egal, da ich jeweils nur den Hauptartikel exportieren möchte. Beispiel: http://www.umschlagfuchs.de/detail/index/sArticle/944 (die Variante mit “Anzahl Briefumschläge: 100” zum Preis von 45,39 EUR ist der Hauptartikel, der exportiert werden soll). Falls doch wichtig: rund 45.000 Artikel wären es mit allen Varianten. * Sonstige Artikel -> Gratis-Artikel (Muster) sollen nicht im Feed enthalten sein (Bedingung: Preis = 0 oder Artikelname LIKE ‘%Muster%’) * Wenn Varianten dann eindimensional, mehrdimensional oder mit Aufpreis -> Alles vorhanden, aber entsprechend vorheriger Erklärung soll nur der Haupt-Artikel exportiert werden. * nur Hauptartikel Was möchtest du denn dafür haben?

@nauralos hab Dir ne PM geschickt