Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
(Web-) Design und webbasierte Sprachen Tipps & Tricks, Designabgleich, HTML & Javascript, Flash, ASP, PHP, Perl/CGI...

Langsammen Query überarbeiten

Diskussion: Langsammen Query überarbeiten im Forum (Web-) Design und webbasierte Sprachen, in der Kategorie Web, Network & Multimedia Palace; Anzeige heyho, ich hab ein kleines spiel laufen, wo man sich durch klicks sessions unterschiedlicher länge sichern kann. man muss ...

Antwort
Alt 16.06.09, 13:20   #1 (permalink)
Member of Honour
 
Benutzerbild von easteregg
 
Registriert seit: 14.09.07
easteregg Leistung: Pentium Ieasteregg Leistung: Pentium I
easteregg eine Nachricht über ICQ schicken
Likes: 62
Langsammen Query überarbeiten

Anzeige

heyho,

ich hab ein kleines spiel laufen, wo man sich durch klicks sessions unterschiedlicher länge sichern kann. man muss sozusagen zeitspannen sammeln und diese werden zu statistiken aufaddiert.

ich hab jetzt eine tabelle wo alle zeitspannen eingetragen sind.
dabei gehts vorallem um die spalten:

Code:
user_id int(10)
time 	int(10)
time_before int(10)
time_diff	int(10)
an daten brauch ich jetzt zu jedem user die gesammtzeit, die er erspielt hat, die wird zu dem user gespeichert. es gibt also in der usertabelle eine timesum spalte.
allerdings möchte ich gerne noch die durchschnittszeiten für den benutzer haben.

der komplette query sieht so aus:

Code:
SELECT
  user.user,user.time_sum,max(resets.time) as last,
      (SELECT 
          AVG(time_diff)
       FROM
          resets 
       WHERE 
          user_id = user.id
              AND 
          added = 1
      ) as avg 
FROM
  resets
INNER JOIN 
  user 
ON
  resets.user_id = user.id 
GROUP BY 
  user.id
ORDER BY
  time_sum
DESC
durch den subquery wird das ganze jetzt aber ziemlich langsam, bei 13k datensätzen brauch ich fast 2 sekunden dafür. (die benutzertabelle hat ca. 200 einträge)

wie bekomm ich jetzt nen durchschnittswert effizienter berechnet. mein plan war, dass ich die avg() bei jedem klick bilde, aber das braucht ja dann auch wieder viel performance, ich glaube da erhalt ich keinen großen vorteil.

jemand hinweise, wie man sowas optimieren kann?
__________________
» Flattr mich! - Wenn dir mein Beitrag geholfen hat! «
<| 2 AMD Opterons 2384@ 8x3,2ghz | Tyan S2915 | 10GB | 2x 8800GT | 8400GS | Dell 3008WFP + 2x2007FP |>
easteregg ist offline   Mit Zitat antworten
Alt 16.06.09, 13:41   #2 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard

Hm, was spricht dagegen, direkt AVG zu verwenden?
SELECT user.user,AVG(resets.time_diff) FROM resets INNER JOIN ....
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 16.06.09, 13:55   #3 (permalink)
Member of Honour
Themenstarter
 
Benutzerbild von easteregg
 
Registriert seit: 14.09.07
easteregg Leistung: Pentium Ieasteregg Leistung: Pentium I
easteregg eine Nachricht über ICQ schicken
Likes: 62
Standard

weil ich ja nen select über die 200 benutzer starte um die "bestenliste" zu bekommen.
für nen einzelnen benutzer mach ich das so wie du es vorgeschlagen hast.

ich brauch in dem select aber von jedem der 200 benutzer den avg().
das macht das ganze ja auch so langsam, 200 mal über 13k datensätze nen selektiven avarage berechnen.
__________________
» Flattr mich! - Wenn dir mein Beitrag geholfen hat! «
<| 2 AMD Opterons 2384@ 8x3,2ghz | Tyan S2915 | 10GB | 2x 8800GT | 8400GS | Dell 3008WFP + 2x2007FP |>
easteregg ist offline   Mit Zitat antworten
Alt 16.06.09, 14:05   #4 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard

Naja, da Du die User gruppierst, gilt die Aggregatfunktion nur für die Gruppe
http://www.oreilly.de/catalog/sqlnut...pter/ch04.html
Code:
 Die folgende Abfrage berechnet durchschnittliche Verkaufszahlen für das laufende Jahr für jeden Buchtyp:

SELECT   type, AVG( ytd_sales ) AS "average_ytd_sales"

FROM     titles 

GROUP BY type;
Durch den JOIN hast Du ja schon alle Spalten aus resets "automatisch" drin, die Du nochmal extra in der Subquery ermittelst. Durch Groupby bildest Du auch schon die "User Gruppen". Eine Aggregatfunktion darauf gilt dann für die jeweilige Gruppe.
Bsp2:
Tabelle:
http://sqlcourse2.com/items_ordered.html
In der Tabelle sind also alle Bestellungen samt Preis und Userids (wie eben bie Dir nach dem join die userids samt Zeiten stehen sollten).
Anfrage um die Durschschnittsausgabe der einzelnen User pro Bestellung herauszufinden:
http://sqlcourse2.com/cgi-bin/sqlcmd...merid%3B%0D%0A


Edit: musst eventuell noch die "AND added=1" Bedingung in den Join verlagern (k.A wofür sie dient ).
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 16.06.09, 14:31   #5 (permalink)
Member of Honour
Themenstarter
 
Benutzerbild von easteregg
 
Registriert seit: 14.09.07
easteregg Leistung: Pentium Ieasteregg Leistung: Pentium I
easteregg eine Nachricht über ICQ schicken
Likes: 62
Standard

ah, jetzt versteh ich wie du das meinst.
ja, das added=1 gibt mir nur gültige zurück (es wird unterschieden, ob gültig -> in die wertung mit aufgenommen, oder ungültig).

kann man where clauseln in die jointanweisungen mit reinnehmen?
in der tat, das ist mal gut zu wissen

klappt super und ist deutlich schneller:

Code:
alt: 221 total query took 1.7752
neu: 219 Total, Query took 0.0493
super, danke und gelöst
__________________
» Flattr mich! - Wenn dir mein Beitrag geholfen hat! «
<| 2 AMD Opterons 2384@ 8x3,2ghz | Tyan S2915 | 10GB | 2x 8800GT | 8400GS | Dell 3008WFP + 2x2007FP |>
easteregg ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Web, Network & Multimedia Palace » (Web-) Design und webbasierte Sprachen » Langsammen Query überarbeiten
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
hilfe bei query optimierung easteregg (Web-) Design und webbasierte Sprachen 2 08.07.09 20:15
SQL: Query gesucht boehmi Code Kitchen 5 05.05.09 20:56
Wie bekomme ich dieses SQL-query hin? jesus Code Kitchen 1 19.02.07 11:49


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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61