Ankündigung

Einklappen
Keine Ankündigung bisher.

Zu lange Laufzeiten (SQL / Schleifen)

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Zu lange Laufzeiten (SQL / Schleifen)

    Hallo liebe Forengemeinde,
    ich habe ein Script erstellt, das die Ergebnisse aus einer Datenbank mit Bowlingeinzelergebnissen (ca.16000) grafisch auswerten soll.
    Zu diesem Zweck läuft das Script in einer Schleife über alle infragekommenden Spieler. In dieser Schleife wiederum läuft eine weitere Schleife über jeden Tag des Abfragezeitraumes und führt diverse Mysql Selects aus und füllt jeweils ein Array.
    Die Laufzeit ist bei einem halben Jahr bereits be ca.50 Sekunden. Ich habe jedoch Daten aus bis jetzt 8 Jahren in der DB.

    Jetzt würde ich mich freuen, wenn mir jemand bei der deutlichen Verkürzung der Laufzeit helfen könnte.

    Vielen Dank,
    Stephan

    Hier der Code (ist leider etwas länger):
    PHP-Code:
    $datax = array();
    $data = array();
    $color = array("white","red","green","blue","black","orange","pink","brown","purple","lightskyblue","lightgreen",
                   
    "lightred","darkblue","darkgreen","darkred","aquamarine","blueviolet","bisque","cornflowerblue",
                   
    "deeppink","darkgoldenrod","salmon1","wheat1","magenta","navy","mediumpurple","olivedrab4","orangered2",
                   
    "palegreen3","snow3","springgreen","skyblue","plum3","yellowgreen","tan","tan1","turquoise","turquoise4",
                   
    "olivedrab2");
    $linie = array();
    $von_stamp sql2stamp($von_datum);
    $bis_stamp sql2stamp($bis_datum);
    $sql_neu=$sql;

    // Grafik anlegen
    $graph = new Graph(800,600,"auto");    
    $graph->SetScale("datlin");
    $graph->img->SetMargin(50,90,40,50);

        
    $sqlbef=  "SELECT DISTINCT bow_spiele.passnr as passnr, bow_spieler.name as nname, bow_spieler.vorname as vname
                   FROM bow_spiele, bow_spieler, bow_wettkampf, bow_orte"
    .$sql_tab5."
                   WHERE bow_spieler.passnr = bow_spiele.passnr
                   AND bow_wettkampf.nr = bow_spiele.wettkampf
                   AND bow_orte.nr = bow_spiele.ort
                   AND bow_spiele.datum >= '"
    .$von_datum."'
                   AND bow_spiele.datum <= '"
    .$bis_datum."'
                   AND "
    .$sql_neu." ".$sql_group1;
    $result mysql_query($sqlbef,$link);
    if (
    $einzel == 1)
      {
    //***************************************************************************************************
    // Schleife über alle Spieler
    //***************************************************************************************************
      
    while ($spieler mysql_fetch_array($result))
        { 
    //Anfang Spieler-Schleife
        
    $sql_neu "bow_spiele.passnr = ".$spieler[passnr]." AND ".$sql;
      
    $erst_wert 0;
      
    $u 0;
    //Farbenzaehler
      
    $r++;

    //***************************************************************************************************
    // Schleife über alle Tage
    //***************************************************************************************************
      
    for ($i $von_stamp$i <= $bis_stamp ;$i $i+86400)
        {
    // Tageszaehler
        
    $u++;

    // Soll die Schnittentwicklung oder der -verlauf ermittelt werden?
        
    if ($entwicklung == 0)
          {
          
    $k"=";
          
    $l"verlauf";
          }
        else
          {
          
    $k ">= ".$von_datum." AND bow_spiele.datum <= ";
          
    $l"entwicklung";
          }

    // Prüfen, ob der Wert des Tages leer ist (kein Ergebnis an diesem Tag)

        
    $sqlbef2=  "SELECT max(bow_spiele.datum) as datum
                   FROM bow_spiele, bow_spieler, bow_wettkampf, bow_orte"
    .$sql_tab5."
                   WHERE bow_spieler.passnr = bow_spiele.passnr
                   AND bow_wettkampf.nr = bow_spiele.wettkampf
                   AND bow_orte.nr = bow_spiele.ort
                   AND bow_spiele.datum = '"
    .date("Y-m-d",$i)."' 
                   AND "
    .$sql_neu." ".$sql_group1;

        
    $result2 mysql_query($sqlbef2,$link);
        
    $akt_erg mysql_result($result2,0"datum");

        if (
    $akt_erg == '')
          {
          if(
    $erst_wert != 0)
            {
            
    $schnitt '-';
            
    $data[]=$schnitt;
            }
          else
            {
            
    $data[] = "";
            }
          }
        else
          {
          
    $sqlbef1=  "SELECT max(bow_spiele.passnr) as passnr, max(bow_spieler.name) as nname, max(bow_spieler.vorname) as vname, max(bow_spiele.datum) as datum, sum(bow_spiele.wert) as wert, count(bow_spiele.wert) as anzahl
              FROM bow_spiele, bow_spieler, bow_wettkampf, bow_orte"
    .$sql_tab5."
              WHERE bow_spieler.passnr = bow_spiele.passnr
              AND bow_wettkampf.nr = bow_spiele.wettkampf
              AND bow_orte.nr = bow_spiele.ort
              AND bow_spiele.datum "
    .$k." '".date("Y-m-d",$i)."' 
              AND "
    .$sql_neu." ".$sql_group1;
          
    $result1=mysql_query($sqlbef1,$link);
          
    $row mysql_fetch_array($result1);
          
    $erst_wert 1;
          
    $schnitt $row["wert"]/ $row["anzahl"];
          
    $data[]=($schnitt);
          }

    // Nur beim jeweils ersten Tag wird der Name ermittelt

        
    if ($u == 1)
          {
          
    $name_kompl =$row["vname"]." ".$row["nname"];
          }

    // Nur beim ersten Spieler werden die Werte für die X-Achse aufgenommen
        
    if ($r==1)
          {
          if (
    $i == 0)
            {
            
    $datax[] = date("d.m.Y",$bis_stamp);
            }
          else
            {
            
    $datax[] = date("d.m.Y",$i);
            }
          }
        }
           
    //Zeichnen der Linie
        
    if ($u 500)
          {
          
    $w 2;
          }
        else
          {
          
    $w 3;
          }

        
    $lineplot=new LinePlot($data);
        
    $lineplot->SetLegend($name_kompl);
        
    $lineplot->SetColor($color[$r]);
        
    $lineplot->mark->SetType(MARK_FILLEDCIRCLE);
        
    $lineplot->mark->SetFillColor($color[$r]);
        
    $lineplot->mark->SetColor($color[$r]);
        
    $lineplot->mark->SetWidth($w);

    // Hinzufügen der Linien zur Grafik
        
    $graph->Add($lineplot);
        
    $data=array();
        
    $datax2 = array();
        } 
    //Ende Spieler-Schleife
      


  • #2
    Muss die Berechnung wirklich bei jedem Scriptaufruf stattfinden, oder kannst du das ganze zB einmal täglich aktualisieren und in eine extra Datei speichern?

    Wenn ja dann leite die Ausgabe doch in eine Datei um und lass diese täglich über einen CronJob oder ähnliches aktualisieren.
    twitter.com/moveax1 || http://modxcms.com/ || http://ubuntuusers.de/

    $live->free() OR die();

    Kommentar


    • #3
      interessant wären da noch die datenbankstrucktur sowie einige vergleichsdaten.

      fang mit dem debuggen bei den queries an. lass dir jeden query ausgeben und führe ihn mit explain aus (ergebnis hier posten SAMT strucktur der tabelle(n)) . dann aktiviere profiling (geht mit phpmyadmin auch, einfach unter dem ausgeführten query der ja wieder angezeigt wird "messen" checkbox aktivieren) und führe den query nocheinmal aus (ergebnis wieder posten).
      [B]PHP4?!?[/B]>>>[B]Aktuelle[/B] PHP Version: [B]5.2.11 || 5.3.0
      [URL="http://en.opensuse.org/Factory/News"]Suse 11.2 *vorfreude*[/URL]
      [/B]

      Kommentar


      • #4
        Vor allem führe keine Queries in Schleifen aus.
        [COLOR="#F5F5FF"]--[/COLOR]
        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
        [COLOR="#F5F5FF"]
        --[/COLOR]

        Kommentar


        • #5
          Vielen Dank für die vielen Vorschläge,
          da habe ich ja einiges auszuprobieren.
          Ich melde mich, wenn ich Erfolge aufzuweisen habe

          Kommentar

          Lädt...
          X