Flashhilfe.de - Flash Community

Multicore Unterstützung MYSQL

 


AntwortenRegistrieren Seite1  

coloneltw#1
Benutzerbild von coloneltw
Beiträge: 11
Registriert: Mar 2010

16.06.2010, 10:30

Hallo an alle,
bastle an ein paar SQL Querys die wohl unseren MySQL Server zum erliegen bringen.
Die Querys sind sehr komplex bzw. lang und wohl ein Killer für SQL.
Wenn den losjage ist die Auslastung der 4 CPUs bei gerade mal 25% und der Query läuft ewig bzw. kommt nicht zum Ende.
Ich möchte eigentlich nicht den gesamten Query hier einbinden daher ein Auszug:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Snagit 9
SELECT distinct concat(tmp_csv2table_hardware.col_name,'_5382') as import_id, 'mmw_ads' as import_data_source_id, tmp_csv2table_hardware.col_name as import_device_id,
       '5382' as import_product_id, '1' as quantity
  FROM    smarttrack_prod.tmp_csv2table_hardware tmp_csv2table_hardware
       INNER JOIN
          smarttrack_prod.tmp_csv2table_software tmp_csv2table_software
       ON (tmp_csv2table_hardware.col_id =
              tmp_csv2table_software.col_id)
WHERE substring(tmp_csv2table_software.col_name,1,8) = 'SnagIt 9'
            AND   to_days(substring(now(),1,10)) - to_days(tmp_csv2table_hardware.col_lastcome) < 90
            OR    tmp_csv2table_hardware.col_lastcome is null

UNION ALL

# Altova XML Spy 2008
SELECT distinct concat(tmp_csv2table_hardware.col_name,'_2124') as import_id, 'mmw_ads' as import_data_source_id, tmp_csv2table_hardware.col_name as import_device_id,
       '2124' as import_product_id, '1' as quantity
  FROM    smarttrack_prod.tmp_csv2table_hardware tmp_csv2table_hardware
       INNER JOIN
          smarttrack_prod.tmp_csv2table_software tmp_csv2table_software
       ON (tmp_csv2table_hardware.col_id =
              tmp_csv2table_software.col_id)
WHERE tmp_csv2table_software.col_name = 'Altova MissionKitÂ? 2008 rel. 2 for Professional Software Architects'<br /             AND   to_days(substring(now(),1,10)) - to_days(tmp_csv2table_hardware.col_lastcome) < 90
            OR    tmp_csv2table_hardware.col_lastcome is null


Davon sind es ca. 100 die mit UNION ALL zusammengefasst werden.
Im Normalfall läuft das gesammte Statement in weniger als 1 Minute durch. Musste aber eine weitere Where Klausel einfügen

ActionScript:
1
2
AND   to_days(substring(now(),1,10)) - to_days(tmp_csv2table_hardware.col_lastcome) < 90
OR     tmp_csv2table_hardware.col_lastcome is null


und das für alle 100.
Im Prinzip macht der Query folgendes. Ich habe eine Tabelle in der alle Installierten Produkte drin stehen (Tabelle Software) und eine Tabelle in der alle gescannten Endgeräte drin stehen (Hardware). In beiden tabellen gibt es die Spalte ID. Ich kann also in der Softwaretabelle sehen auf welcher ID diese läuft und über die Tabelle Hardware bekomme ich den PC Namen heraus. Mehr soll sie eigentlich nicht tun.
Nun haben wir im System aber auch PCs die sich seit ewig nicht mehr gemeldet haben, diese möchte ich ausschließen daher diese zusätzlichen Where Klauseln, die alle PCs anzeigen die die entsprechende Software haben und die sich in den letzten 90 Tagen gemeldet haben oder die keinen Eintrag in dieser Spalte haben (für einige PCs wird das Datum nicht mitgepflegt).

Seit dem spinnt er rum. Ich weiß das diese Art der Abfrage nicht wirklich gut ist für SQL aber leider lässt sich dies nicht verhindern. Ich habe auch kein Ressourcen Problem, wenn das Ding 8 Kerne braucht, bekommt er 8, braucht er mehr Ram soll er es bekommen aber die Auslastung liegt gerade mal bei 25% und ich denke die Abfrage läuft so lange, das am Ende ein Timeout die Software lahmlegt.
Meine Frage wäre also, ob ich MySQL in soweit optimieren kann, dass er zur verfügungstehende Ressourcen auch nutzt. Laut Handbuch ist MySQL Multicorefähig aber er scheint nur eine zu nutzen und diese 100% dann auf alle zu verteilen statt mal alle anderen zusätzlich zu nutzen.

Habe ihn jetzt mittels automatischen Job angeworfen damit nicht die Webseite einen Timeout bekommt, das klappt. Aber statt 2 Minuten läuft er nun 25 Minuten.
Sprich für die Nachtverarbeitung ist das kein Thema aber nicht für Tests zwischendurch.
Kann ich MySQL beibringen alle Ressourcen bis zum Ende auszunutzen?
Der Server ist virtuell auf einem ESX vspere auf einen Nehalem mit 2 Hexacores und 96GB Ram.
Ich kann ihn also ohne Ende hochdrehen wenn es nützt. Wenn ich es schaffe das er wenigsten auf 50% geht, dann läge die Verarbeitungszeit bei vielleicht 12-13 Minuten, das wäre noch ok.
Ansonsten liegen seine Platten im SAN und haben auch genug IOs zur Verfügung.

Also vielen Dank schonmal
Werbung
Beiträge: 0
Registriert: Feb 2016


jomac#2
Benutzerbild von jomac
Beiträge: 89
Wohnort: CH
Registriert: Jun 2010

16.06.2010, 13:56

MySQL Queries sind linear. Pro Query wird eine Verbindung aufgebaut. Pro Verbindung wird nur ein Thread gestartet. Ein Thread kann nur ein Processor benutzen.
Du müsstest also insofern möglich mehr als ein Query benutzen.
coloneltw#3
Benutzerbild von coloneltw
Beiträge: 11
Registriert: Mar 2010

Themenautor/in

16.06.2010, 15:09

hmm das ist allerdings Mist.
Wenn ich das versuche muss ich meine ganze Strategie ändern.
Zur Zeit sind alle SQL Statements in XML Dateien verbaut, die dann mit dem Tool verarbeitet werden.
Im Prinzip liest dieses tool csv, xls Dateien in temoräre Tabellen ein und kann diese dann mit SQL Sprache verarbeiten bzw. das Ergebnis wieder per csv rauswerfen.
Anschließend kann das Tool diese CSV in seine Produktionstabellen überführen.
Ist halt voll auf CSV aufgebaut, da dies der einzige gemeinsame Nenner bei allen möglichen Quellen ist. Sprich jedes Programm/Tool kann irgendwie seine Daten per CSV exportieren, darauf setzt das Programm.
Sprich ich gebe den ganzen SQL Query in eine XML Datei ein und das Tool macht den Rest. Wenn ich jetzt die Querys auseinander nehme um die CPU Power zu nutzen müsste ich die Abfrage direkt gegen die SQL Datenbank richten und das programm verarbeitet nur noch die CSV Ausgabe.
Heisst aber im Umkehrschluss auch, dass ich mehrere Scripte benötige die dann gut gesteuert ablaufen noch bevor das Programm anfängt die erzeugten CSV Dateien einzulesen.
Das wird heftig.
Gibt es denn irgendwie eine Möglichkeit mit MySQL dann parallel Daten in eine CSV zu packen?
Meine Idee wäre jetzt, dass ich alle mit Union All verbundenen Querys in Einzelscripte verpacke und  die Ausgabe in eine CSV Datei schreiben lasse. Das ganze dann noch schön auf die CPUs verteilt.
Dann aber stoße ich auf das Problem wer darf in die Datei schreiben. Sie müssten ja alle hintereinander weg schreiben....
jomac#4
Benutzerbild von jomac
Beiträge: 89
Wohnort: CH
Registriert: Jun 2010

16.06.2010, 15:22

Ich weiss natürlich nicht genau wie die Daten bei dir aussehen, aber du musst sehr wahrscheinlich nicht alle Queries aufteilen, es reicht wenn du sie in Blöcke die der Anzahl der CPUs entsprechen aufteilst.
Du könntest danach evtl. für jeden Block eine Datei nehmen und die am Schluss zusammenführen, was auch immer da genau zusammengehört/zusammengeführt werden muss weiss ich nicht, aber diese Informationen hast du ja wahrscheinlich.

Nochmals zum Beitrag zur besseren Performance der Queries:
Statt INNER JOIN auf die gesamte Tabelle anzuwenden benutzt du z.B. ... FROM SUBSELECT res INNER JOIN ... während du in deinem SUBSELECT die WHERE-Bedingungen platzierst. In einer so grossen Datenbank kann das die Performance sehr stark verbessern.
Werbung
Beiträge: 0
Registriert: Feb 2016


coloneltw#5
Benutzerbild von coloneltw
Beiträge: 11
Registriert: Mar 2010

Themenautor/in

18.06.2010, 12:16

Hallo Jomac,
habe mal versucht die Querys in Blöcke zu teilen. Er meckert dann aber herum von wegen das ich Union und Into nicht nutzen kann. Nach ein wenig Google Suche kam heraus das das eventuell an der MySQL version liegt. Diese war nich auf 5.0.86. Ich habe sie jetzt auf 5.1.37 upgegraded aber es kommt der gleiche Fehler. Irgendwie mag er nicht wenn mit Unions verbundene Querys mit into outfile in csvs reinschreiben.
Kennst du das?

AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   php-resource.de   phpforum.de   phpwelt.de   Pixelio.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Hier Werben   Impressum
© 1999-2019 Sebastian Wichmann - Flashhilfe.de