[SQL] Problemen met snelheid van ophalen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • n2theb
  • Registratie: Augustus 2012
  • Laatst online: 10-09 15:44

n2theb

Tweakers Abonnee

Topicstarter
Hoe zou ik de volgende SQL code korter of effcienter maken? Het werkt snel met een kleine dataset alleen als er veel data (meer dan 1000 in order & 1200 in invoice & 4000 in order_status) in staat is het heel langszaam.

Gaat om het volgende stukje SQL:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT o.O_order_ID
         FROM (
            SELECT o.*, max(os.OS_datetime) latestDate
            FROM `order` o
            INNER JOIN `order_status` os ON o.O_order_ID = os.O_order_ID
            GROUP BY o.O_order_ID
            ) o
         INNER JOIN `order_status` os ON os.O_order_ID = o.O_order_ID
         LEFT JOIN invoice i ON o.O_order_ID = i.O_order_ID AND i.I_type = 'invoice'
         LEFT JOIN invoice c ON o.O_order_ID = c.O_order_ID AND c.I_type = 'credit'
         WHERE o.O_order_ID <> '' AND os.OS_datetime = o.latestDate
         AND o.O_payment_status = '1'
GROUP BY o.O_order_ID


Nadeel is dat ik die invoice niet kan en mag ombouwen tot een waardig tabel met invoices en credits. En de subquery betreft order_status moet de laatst mogelijke status van de bestelling ophalen.

[ Voor 5% gewijzigd door n2theb op 16-10-2015 09:50 ]


Acties:
  • 0 Henk 'm!

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 18:11

Knutselsmurf

LED's make things better

de sleutelwoorden zijn INDEX en EXPLAIN

- This line is intentionally left blank -


Acties:
  • 0 Henk 'm!

  • n2theb
  • Registratie: Augustus 2012
  • Laatst online: 10-09 15:44

n2theb

Tweakers Abonnee

Topicstarter
Knutselsmurf schreef op vrijdag 16 oktober 2015 @ 10:01:
de sleutelwoorden zijn INDEX en EXPLAIN
Indexes zijn uitgevoerd op de tabellen. Wat doet explain?

Ik heb explain uitgevoerd zie volgend plaatje;
Afbeeldingslocatie: http://tweakers.net/ext/f/WI7ui9o73urH8k65n8EOHlTx/full.png

Kan je hier iets mee?

[ Voor 39% gewijzigd door n2theb op 16-10-2015 10:18 ]


Acties:
  • 0 Henk 'm!

  • n2theb
  • Registratie: Augustus 2012
  • Laatst online: 10-09 15:44

n2theb

Tweakers Abonnee

Topicstarter
Voordat ik deze topic aanmaakte had ik al een wijziging in een join verandert waar een dubbele check stond van o.O_order_ID = o.O_order_ID, dit had ik aangepast naar os.O_order_ID = o.O_order_ID. Had deze fout echter eerder over het hoofd gezien.

Topic mag mijn part dicht, maar hebben jullie eventuele tips voor een betere code? Waarvan ik kan leren!

[ Voor 14% gewijzigd door n2theb op 19-10-2015 08:05 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
n2theb schreef op vrijdag 16 oktober 2015 @ 10:24:
Topic mag mijn part dicht, maar hebben jullie eventuele tips voor een betere code? Waarvan ik kan leren!
Een slotje is niet nodig op een topic als je je oplossing hebt. Zie daarvoor ook onze faq betreffende topiceinde.
Verder willen we best je vragen beantwoorden maar zul je wel concrete vragen moeten stellen. De vraag die je nu stelt is veel te breed. Verder: Gebruik a.u.b. de wijzig-link (rechtsbovenaan je post) als je iets toe te voegen hebt; je topic herhaaldelijk omhoogschoppen is niet nodig.

Dan toch wat tips:
[list]
Hoe werkt dat GROUP BY nu eigenlijk? (je doet SELECT o.*, max(os.OS_datetime) latestDate ... GROUP BY o.O_order_ID
• "Hoe zou ik de volgende SQL code korter of effcienter maken?": Korter is totaal irrelevant.
• "alleen als er veel data... in staat is het heel langszaam": Define langzaam ;)
• Persoonlijk noem ik indices graag IX_order_id i.p.v. O_Order_Id of iets dergelijks; je ziet nu in je explain bijna door de bomen 't bos niet; sowieso: is die O_ prefix op al die velden nodig?
• En nu ik nog een keer kijk: volgens mij worden er helemaal geen indices gebruikt in je query? Welke indexen heb je precies gemaakt en welke verwacht je dat die query zou (moeten) gebruiken?

[ Voor 34% gewijzigd door RobIII op 16-10-2015 11:10 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 23:10

Janoz

Moderator Devschuur®

!litemod

Ik zou vooral even HEEL goed naar punt 1 van RobIII kijken. Waarschijnlijk krijg je nu NIET de juiste gegevens uit de database. Als ik even vluchtig naar je query kijk dan lijkt het er op dat je random payment statussen aan je orders aan het toevoegen bent. Lijkt me voor je rapportage toch wel redelijk cruciaal...

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1