Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[MySQL] Is deze query wel correct?

Pagina: 1
Acties:
  • 286 views

  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 10-11 15:08
Hallo,

Ik heb een query die ik probeer te draaien. Hij draait nu echter al een uur of 8 (cpu op 100%) en hij is nog steeds niet klaar. Ik vraag mij dus af of hij eigenlijk wel correct is. Hij ziet er als volgt uit:

SQL:
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
SELECT AVG(euro.OPENvsSLOT)
FROM euro, aex, bel, cac, dax, ibex
WHERE (aex.SLOTvsOPEN > 0.1
 AND bel.SLOTvsOPEN > 0.2)
OR (aex.SLOTvsOPEN > 0.1
 AND cac.SLOTvsOPEN > 0.3)
OR (aex.SLOTvsOPEN > 0.1
 AND dax.SLOTvsOPEN > 0.4)
OR (aex.SLOTvsOPEN > 0.1
 AND ibex.SLOTvsOPEN > 0.5)
OR (bel.SLOTvsOPEN > 0.2
 AND cac.SLOTvsOPEN > 0.3)
OR (bel.SLOTvsOPEN > 0.2
 AND dax.SLOTvsOPEN > 0.4)
OR (bel.SLOTvsOPEN > 0.2
 AND ibex.SLOTvsOPEN > 0.5)
OR (cac.SLOTvsOPEN > 0.3
 AND dax.SLOTvsOPEN > 0.4)
OR (cac.SLOTvsOPEN > 0.3
 AND ibex.SLOTvsOPEN > 0.5)
OR (dax.SLOTvsOPEN > 0.4
 AND ibex.SLOTvsOPEN > 0.5)
AND euro.Datum = aex.Datum
AND euro.Datum = bel.Datum
AND euro.Datum = cac.Datum
AND euro.Datum = dax.Datum
AND euro.Datum = ibex.Datum


Iemand enig idee of dit klopt? Is het inderdaad een dermate complexe query dat hij uren zou moeten draaien (de databank heeft ~ 300.000 records). Iemand tips hoe ik deze query sneller zou kunnen maken..?

Alle tips welkom! :)

Verwijderd

kramer65 schreef op donderdag 14 juli 2011 @ 22:25:
Hallo,

Ik heb een query die ik probeer te draaien. Hij draait nu echter al een uur of 8 (cpu op 100%) en hij is nog steeds niet klaar. Ik vraag mij dus af of hij eigenlijk wel correct is. Hij ziet er als volgt uit:

SQL:
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
SELECT AVG(euro.OPENvsSLOT)
FROM euro, aex, bel, cac, dax, ibex
WHERE (aex.SLOTvsOPEN > 0.1
 AND bel.SLOTvsOPEN > 0.2)
OR (aex.SLOTvsOPEN > 0.1
 AND cac.SLOTvsOPEN > 0.3)
OR (aex.SLOTvsOPEN > 0.1
 AND dax.SLOTvsOPEN > 0.4)
OR (aex.SLOTvsOPEN > 0.1
 AND ibex.SLOTvsOPEN > 0.5)
OR (bel.SLOTvsOPEN > 0.2
 AND cac.SLOTvsOPEN > 0.3)
OR (bel.SLOTvsOPEN > 0.2
 AND dax.SLOTvsOPEN > 0.4)
OR (bel.SLOTvsOPEN > 0.2
 AND ibex.SLOTvsOPEN > 0.5)
OR (cac.SLOTvsOPEN > 0.3
 AND dax.SLOTvsOPEN > 0.4)
OR (cac.SLOTvsOPEN > 0.3
 AND ibex.SLOTvsOPEN > 0.5)
OR (dax.SLOTvsOPEN > 0.4
 AND ibex.SLOTvsOPEN > 0.5)
AND euro.Datum = aex.Datum
AND euro.Datum = bel.Datum
AND euro.Datum = cac.Datum
AND euro.Datum = dax.Datum
AND euro.Datum = ibex.Datum


Iemand enig idee of dit klopt? Is het inderdaad een dermate complexe query dat hij uren zou moeten draaien (de databank heeft ~ 300.000 records). Iemand tips hoe ik deze query sneller zou kunnen maken..?

Alle tips welkom! :)
Niet correct, als ik er zo even snel naar kijk. Welke tabellen heb je, en wat wil je precies bereiken en in wat voor context (php?)

Als het aantal records het probleem is, gebruik dan een LIMIT statement, dan kun je de resultaten beperken tot bijv. 10 records.

  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 10-11 15:08
Wat ik wil hebben is: "Het gemiddelde intradag resultaat van de Euro tov de dollar op dagen dat ten minste twee van de volgende regels "true" zijn:
  • aex opening gap > 0.1
  • bel20 opening gap > 0.2
  • cac40 opening gap > 0.3
  • dax opening gap > 0.4
  • ibex35 opening gap > 0.5
De tabellen zijn:
  • euro
  • aex
  • bel
  • cac
  • dax
  • ibex
Het LIMIT statement wil ik juist niet gebruiken omdat ik alle resultaten in het gemiddelde wil gebruiken (anders klopt het gemiddeld natuurlijk niet meer).

Overigens gebruik ik dit niet in een website. Ik draai het op een lokale server op mijn laptop en doe er wat beleggingsanalyses mee..

Maar de hamvraag: wat doe ik eigenlijk fout?

  • Reinier
  • Registratie: Februari 2000
  • Laatst online: 13:00

Reinier

\o/

Probeer het eens met haakjes om het hele stuk vóór:
AND euro.Datum = aex.Datum
Wellicht maakt dat uit ;)


Edit:
Leg eerst eens fatsoenlijke joins tussen al die tabellen door de laatste regels in je where-clause te vertalen in joincondities. Dan zul je zien dat je where-clausule simpeler wordt (die veroorzaakt je probleem namelijk).

[ Voor 54% gewijzigd door Reinier op 14-07-2011 23:03 ]


  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 10-11 15:08
Dus zoiets:

SQL:
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
SELECT AVG(euro.OPENvsSLOT)
FROM euro, aex, bel, cac, dax, ibex
WHERE ((aex.SLOTvsOPEN > 0.1
 AND bel.SLOTvsOPEN > 0.2)
OR (aex.SLOTvsOPEN > 0.1
 AND cac.SLOTvsOPEN > 0.3)
OR (aex.SLOTvsOPEN > 0.1
 AND dax.SLOTvsOPEN > 0.4)
OR (aex.SLOTvsOPEN > 0.1
 AND ibex.SLOTvsOPEN > 0.5)
OR (bel.SLOTvsOPEN > 0.2
 AND cac.SLOTvsOPEN > 0.3)
OR (bel.SLOTvsOPEN > 0.2
 AND dax.SLOTvsOPEN > 0.4)
OR (bel.SLOTvsOPEN > 0.2
 AND ibex.SLOTvsOPEN > 0.5)
OR (cac.SLOTvsOPEN > 0.3
 AND dax.SLOTvsOPEN > 0.4)
OR (cac.SLOTvsOPEN > 0.3
 AND ibex.SLOTvsOPEN > 0.5)
OR (dax.SLOTvsOPEN > 0.4
 AND ibex.SLOTvsOPEN > 0.5))
AND euro.Datum = aex.Datum
AND euro.Datum = bel.Datum
AND euro.Datum = cac.Datum
AND euro.Datum = dax.Datum
AND euro.Datum = ibex.Datum

  • Reinier
  • Registratie: Februari 2000
  • Laatst online: 13:00

Reinier

\o/

kramer65 schreef op donderdag 14 juli 2011 @ 23:02:
Dus zoiets:

SQL:
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
SELECT AVG(euro.OPENvsSLOT)
FROM euro, aex, bel, cac, dax, ibex
WHERE ((aex.SLOTvsOPEN > 0.1
 AND bel.SLOTvsOPEN > 0.2)
OR (aex.SLOTvsOPEN > 0.1
 AND cac.SLOTvsOPEN > 0.3)
OR (aex.SLOTvsOPEN > 0.1
 AND dax.SLOTvsOPEN > 0.4)
OR (aex.SLOTvsOPEN > 0.1
 AND ibex.SLOTvsOPEN > 0.5)
OR (bel.SLOTvsOPEN > 0.2
 AND cac.SLOTvsOPEN > 0.3)
OR (bel.SLOTvsOPEN > 0.2
 AND dax.SLOTvsOPEN > 0.4)
OR (bel.SLOTvsOPEN > 0.2
 AND ibex.SLOTvsOPEN > 0.5)
OR (cac.SLOTvsOPEN > 0.3
 AND dax.SLOTvsOPEN > 0.4)
OR (cac.SLOTvsOPEN > 0.3
 AND ibex.SLOTvsOPEN > 0.5)
OR (dax.SLOTvsOPEN > 0.4
 AND ibex.SLOTvsOPEN > 0.5))
AND euro.Datum = aex.Datum
AND euro.Datum = bel.Datum
AND euro.Datum = cac.Datum
AND euro.Datum = dax.Datum
AND euro.Datum = ibex.Datum
Ja, dat bedoelde ik eerst, maar het gaat waarschijnlijk nog beter als je dit:
SQL:
1
2
3
4
5
AND euro.Datum = aex.Datum
AND euro.Datum = bel.Datum
AND euro.Datum = cac.Datum
AND euro.Datum = dax.Datum
AND euro.Datum = ibex.Datum

omzet naar joins.

  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 10-11 15:08
Super! Die extra haakjes deden het hem. Van de hele dag draaien naar...0.3285 sec.. :D

Waanzinnig bedankt! Aangezien ik eerder al queries had die een half uur duurden dacht ik dat dit een nog veel complexere query was. Ik vond dit echter wel een beetje te ver gaan, te meer omdat zo'n mysql databank toch echt gemaakt is om resultaten er razendsnel uit te halen.

Heel erg bedankt voor de tip in ieder geval! d:)b

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Heel leuk dat je nu geholpen bent maar jij weet onderhand na al die bijsturing ook wel dat het dumpen van een query zonder verdere achtergrond en vervolgens vragen of hij zo wel goed is ook niet de bedoeling is. Ik ga niet eens meer de moeite doen om FAQ's te linken, je mag gewoon even een tijdje op vakantie van GoT. :w

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1

Dit topic is gesloten.