whine: XML in mySQL einlesen - Performanceproblem

Hallo zusammen,

vor einigen Monaten ist mir hier schon mal prima geholfen worden. Nun kam das Problem nochmal auf den Tisch.

ich lese mit simplexml_load eine XML-Datei ein.

  
if(file_exists($filename)) {  
        $xml = simplexml_load_file($filename);  
  
        if($xml) {  ... 

... und schreibe den Inhalt von etwa 100.000(!) Tags in MySQL

for ($i=1; $i < $size=count($xml); $i++) {  
		  
 $sql_eintrag = "INSERT INTO messwerte_tbl (id,  
	        ".$xml->{"ChannelInfo1"}->Name.",  
		".$xml->{"ChannelInfo2"}->Name.",  
		".$xml->{"ChannelInfo3"}->Name.",  
		".$xml->{"ChannelInfo4"}->Name.",  
		".$xml->{"ChannelInfo5"}->Name.",  
		".$xml->{"ChannelInfo6"}->Name.",  
		".$xml->{"ChannelInfo7"}->Name.",  
		".$xml->{"ChannelInfo8"}->Name.",  
		".$xml->{"ChannelInfo9"}->Name.",  
		".$xml->{"ChannelInfo10"}->Name.",  
		".$xml->{"ChannelInfo11"}->Name.",  
		".$xml->{"ChannelInfo12"}->Name.",  
		".$xml->{"ChannelInfo13"}->Name."  
		  
		) VALUES  
  
		('".$id."',  
		 '".$xml->{"M$i"}->{"Ch1"}."',  
		 '".$xml->{"M$i"}->{"Ch2"}."',  
		 '".$xml->{"M$i"}->{"Ch3"}."',  
		 '".$xml->{"M$i"}->{"Ch4"}."',  
		 '".$xml->{"M$i"}->{"Ch5"}."',  
		 '".$xml->{"M$i"}->{"Ch6"}."',  
		 '".$xml->{"M$i"}->{"Ch7"}."',  
		 '".$xml->{"M$i"}->{"Ch8"}."',  
		 '".$xml->{"M$i"}->{"Ch9"}."',  
		 '".$xml->{"M$i"}->{"Ch10"}."',  
		 '".$xml->{"M$i"}->{"Ch11"}."',  
		 '".$xml->{"M$i"}->{"Ch12"}."',  
		 '".$xml->{"M$i"}->{"Ch13"}."')";  
		$eintrag = mysql_query ($sql_eintrag) or die("Fehler: ".mysql_error());

Soweit sogut. Das dauert natürlich ewig. Zum einen der Dateiupload (wobei das noch vertretbar ist), aber am meisten Sorgen macht mir das schreiben in die DB. Musste schon die Maximum execution time in der php.ini hochsetzen.

Kann ich das irgendwie beschleunigen? Und wenn ja, wie? ;o)

whine

  1. 你好 whine,

    Kann ich das irgendwie beschleunigen? Und wenn ja, wie? ;o)

    MySQL unterstützt eine erweiterte Syntax:

    INSERT INTO tabelle (feld1,feld2,feld3) VALUES (feld1wert,feld2wert,feld3wert),(feld1wert,feld2wert,feld3wert),(feld1wert,feld2wert,feld3wert)

    Die ist scheinbar deutlich schneller. Ansonsten gäbe es noch INSERT DELAYED (http://dev.mysql.com/doc/refman/5.1/en/insert-delayed.html), was das INSERT nicht wirklich beschleunigt, aber den Anschein liefert, weil es deutlich früher das „OK“ an den Client (in diesem Fall PHP) liefert.

    再见,
     克里斯蒂安

    --
    http://wwwtech.de/
    IRC-Clients und Irssi-Scripting | Flyspray
    Der Mund ist das Portal zum Unglück.
    1. INSERT INTO tabelle (feld1,feld2,feld3) VALUES (feld1wert,feld2wert,feld3wert),(feld1wert,feld2wert,feld3wert),(feld1wert,feld2wert,feld3wert)

      Oje, wie kriege ich denn das SQL-Statement mit einer for-Schleife zerhackt?
      Oder seh ich den Wald vor lauter Bäumen nicht?

      whine

      1. 你好 whine,

        INSERT INTO tabelle (feld1,feld2,feld3) VALUES (feld1wert,feld2wert,feld3wert),(feld1wert,feld2wert,feld3wert),(feld1wert,feld2wert,feld3wert)

        Oje, wie kriege ich denn das SQL-Statement mit einer for-Schleife zerhackt?
        Oder seh ich den Wald vor lauter Bäumen nicht?

        Naja, du setzt den ersten Teil des Queries vor der Schleife zusammen, und danach hängst du an den Query-String nur noch so ein Values-Konglomerat an. So, z. B.

          
        if(file_exists($filename)) {  
          $xml = simplexml_load_file($filename);  
          
          if($xml) {  
            $sql = "INSERT INTO messwerte_tbl (id,  
                        ".$xml->{"ChannelInfo1"}->Name.",  
                        ".$xml->{"ChannelInfo2"}->Name.",  
                        ".$xml->{"ChannelInfo3"}->Name.",  
                        ".$xml->{"ChannelInfo4"}->Name.",  
                        ".$xml->{"ChannelInfo5"}->Name.",  
                        ".$xml->{"ChannelInfo6"}->Name.",  
                        ".$xml->{"ChannelInfo7"}->Name.",  
                        ".$xml->{"ChannelInfo8"}->Name.",  
                        ".$xml->{"ChannelInfo9"}->Name.",  
                        ".$xml->{"ChannelInfo10"}->Name.",  
                        ".$xml->{"ChannelInfo11"}->Name.",  
                        ".$xml->{"ChannelInfo12"}->Name.",  
                        ".$xml->{"ChannelInfo13"}->Name."  
          
                        ) VALUES";  
          
            for ($i=1; $i < count($xml); $i++) {  
              $sql .= "('".$id."',  
                         '".$xml->{"M$i"}->{"Ch1"}."',  
                         '".$xml->{"M$i"}->{"Ch2"}."',  
                         '".$xml->{"M$i"}->{"Ch3"}."',  
                         '".$xml->{"M$i"}->{"Ch4"}."',  
                         '".$xml->{"M$i"}->{"Ch5"}."',  
                         '".$xml->{"M$i"}->{"Ch6"}."',  
                         '".$xml->{"M$i"}->{"Ch7"}."',  
                         '".$xml->{"M$i"}->{"Ch8"}."',  
                         '".$xml->{"M$i"}->{"Ch9"}."',  
                         '".$xml->{"M$i"}->{"Ch10"}."',  
                         '".$xml->{"M$i"}->{"Ch11"}."',  
                         '".$xml->{"M$i"}->{"Ch12"}."',  
                         '".$xml->{"M$i"}->{"Ch13"}."')";  
              if($i < count($xml) - 1) $sql .= ",";  
            }  
          
            $eintrag = mysql_query($sql) or die("Fehler: ".mysql_error());  
          }  
        }
        

        Code ist zwar ungetestet, sollte aber laufen.

        再见,
         克里斯蒂安

        --
        http://wwwtech.de/
        IRC-Clients und Irssi-Scripting | Flyspray
        Wenn auf Erden alle das Schoene als schoen erkennen, so ist dadurch schon das Haessliche bestimmt.
        1. Hallo Christian,

          Naja, du setzt den ersten Teil des Queries vor der Schleife zusammen, und danach hängst du an den Query-String nur noch so ein Values-Konglomerat an. So, z. B. ...

          Super, danke. Funktioniert, aber die Zeit bleibt die gleiche (etwa 70s).

          whine

  2. echo $begrüßung;

    Kann ich das irgendwie beschleunigen? Und wenn ja, wie? ;o)

    Probier mal, die Extension mysqli statt mysql zu verwenden und mit einem Prepared Statement zu arbeiten. Dann musst du zum einen nicht ständig das Statement zusammenbauen und MySQL muss es nicht jedes Mal aufs Neue auseinandernehmen.

    echo "$verabschiedung $name";

    1. Hallo dedlfix,

      mysqli bringt auch keine Verbesserung. Ich werde mich mal in "Prepared Statements" einlesen und dann ausprobieren. Dankeschön.

      Gruß whine

      1. echo $begrüßung;

        mysqli bringt auch keine Verbesserung.

        Das hab ich auch nicht erwartet, aber das ist die Voraussetzung, um überhaupt Prepared Statements einsetzen zu können.

        echo "$verabschiedung $name";

        1. So, nu habe ich das mal mit den Prepared Statements versucht, aber das Ergebnis ist noch schlechter :( knappe 120s...

            
          	 for ($i=1; $i <= $xml->Values; $i++) {  
            
              $sql_eintrag = "INSERT INTO exp_analyse_messwerte  
          	        (id,  
          	        Time,  
          	        ".$xml->{"ChannelInfo1"}->Name.",  
          		".$xml->{"ChannelInfo2"}->Name.",  
          		".$xml->{"ChannelInfo3"}->Name.",  
          		".$xml->{"ChannelInfo4"}->Name.",  
          		".$xml->{"ChannelInfo5"}->Name.",  
          		".$xml->{"ChannelInfo6"}->Name.",  
          		".$xml->{"ChannelInfo7"}->Name.",  
          		".$xml->{"ChannelInfo8"}->Name.",  
          		".$xml->{"ChannelInfo9"}->Name.",  
          		".$xml->{"ChannelInfo10"}->Name.",  
          		".$xml->{"ChannelInfo11"}->Name.",  
          		".$xml->{"ChannelInfo12"}->Name.",  
          		".$xml->{"ChannelInfo13"}->Name."  
          		) VALUES  
            
          		(:id, :Time,  :ChannelInfo1, :ChannelInfo2, :ChannelInfo3, :ChannelInfo4  
          		, :ChannelInfo5, :ChannelInfo6, :ChannelInfo7, :ChannelInfo8, :ChannelInfo9, :ChannelInfo10, :ChannelInfo11  
          		, :ChannelInfo12, :ChannelInfo13)";  
            
          	   $stmt = $dbc->prepare($sql_eintrag);  
          	   $stmt->bindParam(':id', $id);  
          	   $stmt->bindParam(':Time', $xml->{"M$i"}->Time);  
          	   $stmt->bindParam(':ChannelInfo1', $xml->{"M$i"}->{"Ch1"});  
          	   $stmt->bindParam(':ChannelInfo2', $xml->{"M$i"}->{"Ch2"});  
          	   $stmt->bindParam(':ChannelInfo3', $xml->{"M$i"}->{"Ch3"});  
          	   $stmt->bindParam(':ChannelInfo4', $xml->{"M$i"}->{"Ch4"});  
          	   $stmt->bindParam(':ChannelInfo5', $xml->{"M$i"}->{"Ch5"});  
          	   $stmt->bindParam(':ChannelInfo6', $xml->{"M$i"}->{"Ch6"});  
          	   $stmt->bindParam(':ChannelInfo7', $xml->{"M$i"}->{"Ch7"});  
          	   $stmt->bindParam(':ChannelInfo8', $xml->{"M$i"}->{"Ch8"});  
          	   $stmt->bindParam(':ChannelInfo9', $xml->{"M$i"}->{"Ch9"});  
          	   $stmt->bindParam(':ChannelInfo10', $xml->{"M$i"}->{"Ch10"});  
          	   $stmt->bindParam(':ChannelInfo11', $xml->{"M$i"}->{"Ch11"});  
          	   $stmt->bindParam(':ChannelInfo12', $xml->{"M$i"}->{"Ch12"});  
          	   $stmt->bindParam(':ChannelInfo13', $xml->{"M$i"}->{"Ch13"});  
          	  
          	   $dbc->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );  
          	   $stmt->execute();  
          	  
          	}
          

          Es wird wohl nicht besser...

          1. echo $begrüßung;

            So, nu habe ich das mal mit den Prepared Statements versucht, aber das Ergebnis ist noch schlechter :( knappe 120s...

            Das Prepare kommt vor die Schleife, weil es nur einmal ausgeführt werden mus. In die Schleife kommen Bind und Execute.

            echo "$verabschiedung $name";

            1. Nabend nochmal,

              Das Prepare kommt vor die Schleife, weil es nur einmal ausgeführt werden mus. In die Schleife kommen Bind und Execute.

              Leider nicht viiiel besser (ca. 90s)

              $dbc = new PDO("mysql:host=localhost;dbname=topko_db", $user, $password);  
              	$dbc->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );  
                
              	$sql_eintrag = "INSERT INTO exp_analyse_messwerte  
              	   (id  
              	    Time,  
              	  
              		 ".$xml->{"ChannelInfo1"}->Name.",  
              		 ".$xml->{"ChannelInfo2"}->Name.",  
              		".$xml->{"ChannelInfo3"}->Name.",  
              		".$xml->{"ChannelInfo4"}->Name.",  
              		".$xml->{"ChannelInfo5"}->Name.",  
              		".$xml->{"ChannelInfo6"}->Name.",  
              		".$xml->{"ChannelInfo7"}->Name.",  
              		".$xml->{"ChannelInfo8"}->Name.",  
              		".$xml->{"ChannelInfo9"}->Name.",  
              		".$xml->{"ChannelInfo10"}->Name.",  
              		".$xml->{"ChannelInfo11"}->Name.",  
              		".$xml->{"ChannelInfo12"}->Name.",  
              		".$xml->{"ChannelInfo13"}->Name."  
              		  ) VALUES  
                
              		(:id, :Time, :ChannelInfo1, :ChannelInfo2, :ChannelInfo3, :ChannelInfo4  
              		, :ChannelInfo5, :ChannelInfo6, :ChannelInfo7, :ChannelInfo8, :ChannelInfo9, :ChannelInfo10, :ChannelInfo11  
              		, :ChannelInfo12, :ChannelInfo13)";  
              	  
                  $stmt = $dbc->prepare($sql_eintrag);  
                
              	 for ($i=1; $i <= $xml->Values; $i++) {  
              	  
              	   $stmt->bindParam(':id', $id);  
              	   $stmt->bindParam(':Time', $xml->{"M$i"}->Time);  
              	   $stmt->bindParam(':ChannelInfo1', $xml->{"M$i"}->{"Ch1"});  
              	   $stmt->bindParam(':ChannelInfo2', $xml->{"M$i"}->{"Ch2"});  
              	   $stmt->bindParam(':ChannelInfo3', $xml->{"M$i"}->{"Ch3"});  
              	   $stmt->bindParam(':ChannelInfo4', $xml->{"M$i"}->{"Ch4"});  
              	   $stmt->bindParam(':ChannelInfo5', $xml->{"M$i"}->{"Ch5"});  
              	   $stmt->bindParam(':ChannelInfo6', $xml->{"M$i"}->{"Ch6"});  
              	   $stmt->bindParam(':ChannelInfo7', $xml->{"M$i"}->{"Ch7"});  
              	   $stmt->bindParam(':ChannelInfo8', $xml->{"M$i"}->{"Ch8"});  
              	   $stmt->bindParam(':ChannelInfo9', $xml->{"M$i"}->{"Ch9"});  
              	   $stmt->bindParam(':ChannelInfo10', $xml->{"M$i"}->{"Ch10"});  
              	   $stmt->bindParam(':ChannelInfo11', $xml->{"M$i"}->{"Ch11"});  
              	   $stmt->bindParam(':ChannelInfo12', $xml->{"M$i"}->{"Ch12"});  
              	   $stmt->bindParam(':ChannelInfo13', $xml->{"M$i"}->{"Ch13"});  
              	  
              	  
              	   $stmt->execute();  
              	  
              	}
              
              1. echo $begrüßung;

                Leider nicht viiiel besser (ca. 90s)
                $dbc = new PDO("mysql:host=localhost;dbname=topko_db", $user, $password);

                Das ist ja auch nicht mysqli sondern PDO. Probier es doch mal mit mysqli. Wenn ich mich recht erinnere, emuliert PDO die Prepared Statements für MySQL nur.

                echo "$verabschiedung $name";

                1. Mahlzeit!

                  jetzt habe ich hin und her probiert, aber ich bekomme mit

                  $dbc = new mysqli("mysqli:host=$host_name;dbname=$db_name", $user, $password); (1)  
                  ...  
                  $stmt = $dbc->prepare($sql_eintrag); (2)  
                  ...  
                   $stmt->bindParam(':id', $id);(3)  
                  
                  

                  nur

                  Warning: mysqli::mysqli() [function.mysqli-mysqli]: (HY000/2005): Unknown MySQL server host 'mysqli:host=... (1)
                  Anm.: phpinfo() sagt, mysqli ist enabled

                  Warning: mysqli::prepare() [function.mysqli-prepare]: Couldn't fetch mysqli (2)in...

                  Fatal error: Call to a member function bindParam() on a non-object in ... (3)

                  Was mache ich bloß falsch? :-)

                  1. echo $begrüßung;

                    jetzt habe ich hin und her probiert, aber ich bekomme mit
                    [code lang=php]$dbc = new mysqli("mysqli:host=$host_name;dbname=$db_name", $user, $password); (1)

                    mysqli ist nicht PDO. Bitte schau in die Dokumentation wie es richtig geht.

                    echo "$verabschiedung $name";

                    1. Hallo dedlfix,

                      nu hab ich mal alles nach prozedualem und OO-Stil versucht, aber immer noch ohne Erfolg:

                      $link = mysqli_connect($host, $user, $pw, $db_name);  
                      	  
                      /* check connection */  
                      if (mysqli_connect_errno()) {  
                          printf("Connect failed: %s\n", mysqli_connect_error());  
                          exit();  
                      }  
                      /* create a prepared statement */  
                         if ($stmt = mysqli_prepare($link, "INSERT INTO test_tbl  
                      	   (id,  
                      	    ".$xml->{"ChannelInfo1"}->Name.",  
                      	    ".$xml->{"ChannelInfo2"}->Name.") VALUES  
                        
                      		(?, ?, ?)")) {  
                        
                      for ($i=1; $i <= $xml->Values; $i++) {  
                        
                      /* bind parameters for markers */  
                      mysqli_stmt_bind_param($id, $xml->{"M$i"}->{"Ch1"}, $xml->{"M$i"}->{"Ch2"});  
                      mysqli_error();  
                        
                      /* execute query */  
                      mysqli_stmt_execute($stmt);  
                        
                      /* close statement */  
                      mysqli_stmt_close($stmt);	  
                        
                      	  
                      }  
                      }  
                      mysqli_close($link);   
                      
                      1. Fehlermeldungen hab ich noch vergessne :

                        Warning: mysqli_stmt_bind_param() expects parameter 1 to be mysqli_stmt, string given in ...

                        Warning: mysqli_error() expects exactly 1 parameter, 0 given in ...

                      2. echo $begrüßung;

                        /* bind parameters for markers */
                        mysqli_stmt_bind_param($id, $xml->{"M$i"}->{"Ch1"}, $xml->{"M$i"}->{"Ch2"});
                        mysqli_error();

                        Angesichts dieses Codes und dem Vergleich mit dem Handbuch wunderst du dich über nachfolgende Meldungen?

                        Warning: mysqli_stmt_bind_param() expects parameter 1 to be mysqli_stmt, string given in ...
                        Warning: mysqli_error() expects exactly 1 parameter, 0 given in ...

                        mysqli_stmt_bind_param(
                          $stmt, // erster Parameter ist die Variable mit dem Prepared Statement
                          'iss', // zweiter Parameter gibt an, welche Typen verarbeitet werden sollen
                          $id, $xml->{"M$i"}->{"Ch1"}, $xml->{"M$i"}->{"Ch2"}); // dann kommen die Variablen

                        mysqli_error() verlangt den Link als Parameter und das Rückgabeergebnis musst du auch noch irgendwie in Empfang nehmen oder ausgeben, sonst ist der Aufruf witzlos.

                        Und schließen darfst du das $stmt auch erst, nachdem alles erledigt ist, also nach der Schleife.

                        echo "$verabschiedung $name";

                        1. Danke, jetzt gehts. Aber leider bleiben es über 90s.
                          Wobei mir aufgefallen ist, dass das Schreiben in die DB irgendwie logarithmisch erfolgt. Habe mal mitgestoppt:

                          nach  5s = 2000 DS --> wenn es so weitergehen würde... :o)
                          nach 15s = 4200 DS
                          nach 30s = 5200 DS
                          nach 45s = 5900 DS
                          nach 60s = 6400 DS
                          nach 75s = 6800 DS
                          nach 90s = 7100 DS --> Ende

                          whine

                          1. echo $begrüßung;

                            Danke, jetzt gehts. Aber leider bleiben es über 90s.

                            Vielleicht ist es gar nicht das DBMS sondern PHP, das die Zeit verbraucht. Kommentier mal testhalber das Execute aus.

                            Wobei mir aufgefallen ist, dass das Schreiben in die DB irgendwie logarithmisch erfolgt. Habe mal mitgestoppt:

                            Das kann auch am Index liegen, wenn der für jedes Insert neu aufgebaut werden muss. Du kannst es ja mal mit und ohne Index probieren (sofern der nicht für einen Unique-Check benötigt wird).

                            echo "$verabschiedung $name";

                            1. Das kann auch am Index liegen, wenn der für jedes Insert neu aufgebaut werden muss. Du kannst es ja mal mit und ohne Index probieren (sofern der nicht für einen Unique-Check benötigt wird).

                              auch ohne index ist keine Veränderung sichtbar.

                              Vielleicht ist es gar nicht das DBMS sondern PHP, das die Zeit verbraucht. Kommentier mal testhalber das Execute aus.

                              wenn ich es auskommentiere bekomme ich nach ca. 60s ein
                              Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 12582912 bytes)

                              1. echo $begrüßung;

                                » Vielleicht ist es gar nicht das DBMS sondern PHP, das die Zeit verbraucht. Kommentier mal testhalber das Execute aus.
                                wenn ich es auskommentiere bekomme ich nach ca. 60s ein
                                Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 12582912 bytes)

                                Hmm, dann bindet er sich anscheinend zu Tode.

                                Eine Idee hab ich noch: Verlager mal das Bind vor die Schleife und binde normale Variablen. Innerhalb der Schleife weist du diesen Variablen die XML-Ausdrücke zu. Also:

                                mysqli_stmt_bind_param($stmt, 'iss', $id, $ch1, $ch2);

                                und in der Schleife:

                                $ch1 = $xml->{"M$i"}->{"Ch1"};
                                  $ch2 = $xml->{"M$i"}->{"Ch2"};
                                  mysqli_stmt_execute($stmt);

                                Das sieht vielleicht etwas seltsam aus, aber durch das Binding werden aus den Variablen Referenzen. Ein Zuweisen erstellt dann keine neue Variable und wirft den alten Inhalt weg sondern weist den Zuweisungswert der Referenz zu. mysqli kennt durch die Bindung diese Referenz und greift beim Execute auf den aktuellen Inhalt zu.

                                Dies müsste eigentlich auch die vorgesehene Vorgehensweise bei Execute in Schleifen sein. Im Handbuch sieht man das bei den Beispielen zu mysqli_stmt_bind_param() dort allerdings mit nur einer Anwendung und ohne Schleife.

                                Bringt das auch noch keine Verbesserung dann miss zum Vergleich noch mal ohne Execute. Wenn das immer noch lange dauert, ist das XML-Zeug der Schuldige, denn dann ist ja dann nur noch dieses im Spiel.

                                echo "$verabschiedung $name";

                                1. Eine Idee hab ich noch: Verlager mal das Bind vor die Schleife und binde normale Variablen. Innerhalb der Schleife weist du diesen Variablen die XML-Ausdrücke zu. Also:

                                  mysqli_stmt_bind_param($stmt, 'iss', $id, $ch1, $ch2);

                                  und in der Schleife:

                                  $ch1 = $xml->{"M$i"}->{"Ch1"};
                                    $ch2 = $xml->{"M$i"}->{"Ch2"};
                                    mysqli_stmt_execute($stmt);

                                  Die Idee war gut! ich bin jetzt bei etwa 50s und mit auskommemtiertem execute etwas weniger. Ist zwar noch nicht soooo userfreundlich, aber schon ein erster Schritt. Meine Idee wäre jetzt (aufgrund des "logaritmischen" Verhaltens beim INSERT, die XML in 2 Schleifen zu durchlaufen. Also einmal von i=0 bis count/2 und dann nochmal von i=count/2 bis count. Müsste doch eigentlich etwas bringen... aber morgen 8/

                                  whine

                                  1. echo $begrüßung;

                                    Die Idee war gut! ich bin jetzt bei etwa 50s und mit auskommemtiertem execute etwas weniger.

                                    Dann ist es also PHPs SimpleXML-Handling

                                    Meine Idee wäre jetzt (aufgrund des "logaritmischen" Verhaltens beim INSERT, die XML in 2 Schleifen zu durchlaufen.

                                    Das wird vermutlich auch an PHP liegen. Je mehr SimpleXML er zu durchsuchen hat, desto länger wird es dauern. Du siehst ja, wenn das Execute nur für einen geringen Teil der benötigten Zeit zuständig ist, kann also das DBMS nicht der Flaschenhals sein und das Aufteilen wird dir nichts bringen.

                                    echo "$verabschiedung $name";

                                    1. Das wird vermutlich auch an PHP liegen. Je mehr SimpleXML er zu durchsuchen hat, desto länger wird es dauern. Du siehst ja, wenn das Execute nur für einen geringen Teil der benötigten Zeit zuständig ist, kann also das DBMS nicht der Flaschenhals sein und das Aufteilen wird dir nichts bringen.

                                      Guten Morgen,

                                      ja, das habe ich auch festgestellt. Das Aufteilen bringt nix. Aber interessant ist, dass der erste Teil (wie vermutet) sehr schnell durchläuft (10s) und der 2. Teil (auch allein) wieder die 50s braucht.
                                      Also liegt es wohl wirklich am SimpleXML.

                                      whine

                                      1. 你好 whine,

                                        ja, das habe ich auch festgestellt. Das Aufteilen bringt nix. Aber interessant ist, dass der erste Teil (wie vermutet) sehr schnell durchläuft (10s) und der 2. Teil (auch allein) wieder die 50s braucht.
                                        Also liegt es wohl wirklich am SimpleXML.

                                        Naja, dann wird Expat wohl die einzige Möglichkeit sein, das schneller zu machen.

                                        再见,
                                         克里斯蒂安

                                        --
                                        http://wwwtech.de/
                                        IRC-Clients und Irssi-Scripting | Flyspray
                                        Sich erinnern bedeutet, aus einer Erfahrung nicht ausreichend gelernt zu haben.
                                        1. Naja, dann wird Expat wohl die einzige Möglichkeit sein, das schneller zu machen.

                                          ich habs befürchtet, dass ich vom SimpleXML weg muß. Aber Danke für den Hinweis.

                                          whine