[sql] Performance probleempje

Pagina: 1
Acties:

  • eppie
  • Registratie: Maart 2000
  • Niet online
(overleden)
Hallo,

Ik zit met een sql probleem waar ik niet echt uit kom :(

Msttr bevat de records art_no (artikel nummer) en cu_sup_no (klant code) en bevat zo'n 450.000 records.
Mart bevat de records art_no (artikel nummer) en art_desc (artikel omschrijving) en bevat zo'n 100.000 records.

Nou wil ik uit msttr alle artikel nummers die een bepaalde klant gekocht heeft halen en daar dan de omschrijving bij vinden.

Als ik in mijn programma eerst alle artikel nummers ophaal uit msttr voor een klant en dan de omschrijving uit mart haal gaat dit erg snel maar zodra ik dit in 1 query wil doen duurt het 3 minuten en langer :(.

de 2 losse query's:
SQL:
1
2
SELECT distinct art_no FROM msttr WHERE cu_sup_no = klant code;
SELECT art_desc FROM mart WHERE art_no = artikel code ;


Bij deze query's duurt het gewoon erg lang :(
SQL:
1
2
3
4
5
SELECT mart.art_no, mart.art_desc FROM mart INNER JOIN msttr ON mart.art_no =
 msttr.art_no WHERE msttr.cu_sup_no = klant code;

SELECT mart.art_no, mart.art_desc FROM mart, msttr WHERE msttr.cu_sup_no = 
klant code AND msttr.art_no = mart.art_no;

Subquery's worden niet ondersteund door deze versie van mysql (4.0).

Wat is er fout aan deze query's waardoor het zo lang duurt?

Ik kan het natuurlijk wel door middel van die 2 aparte query's doen maar dat lijkt me niet erg netjes.

Alvast bedankt.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:34
Heb je indexen op je tabel ? (op de columns msttr.cu_sup_no en mart.art_no en msttr.art_no)?

https://fgheysels.github.io/


Verwijderd

eppie schreef op dinsdag 21 december 2004 @ 10:55:
Nou wil ik uit msttr alle artikel nummers die een bepaalde klant gekocht heeft halen en daar dan de omschrijving bij vinden.
Waarom doe je niet gewoon een join?

SQL:
1
2
3
Select Distinct mart.Art_No, mart.Art_desc 
from Mssttr, Mart 
where Mssttr.Artno=Mart.ArtNo AND cu_sup_no=12345

  • eppie
  • Registratie: Maart 2000
  • Niet online
(overleden)
Nee zijn geen indexen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:34
Plaats er dan.

Regel 1: zet indexen op columns waarop je zoekt of joined. Als je dat niet doet, dan moet het DBMS een table scan gaan uitvoeren om jouw query te gaan uitvoeren, en dan is het vanzelfsprekend dat je query traag gaat....
Verwijderd schreef op dinsdag 21 december 2004 @ 11:03:
[...]


Waarom doe je niet gewoon een join?

SQL:
1
2
3
Select Distinct mart.Art_No, mart.Art_desc 
from Mssttr, Mart 
where Mssttr.Artno=Mart.ArtNo AND cu_sup_no=12345
Dat doet hij.

[ Voor 75% gewijzigd door whoami op 21-12-2004 11:06 ]

https://fgheysels.github.io/


  • eppie
  • Registratie: Maart 2000
  • Niet online
(overleden)
Zal het is proberen bedankt voor de snelle reply's.

Dit word gekopieert uit een nogal oude database die nog nooit van indexen, keys enz gehoord heeft :P

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-05 18:53

Bosmonster

*zucht*

Bedenk bij het zetten van indices dat MySQL maar 1 index per query kan gebruiken. Losse indices op alle velden heeft dus weinig nut. Je zult per query moeten kijken wat je nodig hebt.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:34
Bosmonster schreef op dinsdag 21 december 2004 @ 11:29:
Bedenk bij het zetten van indices dat MySQL maar 1 index per query kan gebruiken. Losse indices op alle velden heeft dus weinig nut. Je zult per query moeten kijken wat je nodig hebt.
:o
OMG.

https://fgheysels.github.io/


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Bosmonster schreef op dinsdag 21 december 2004 @ 11:29:
Bedenk bij het zetten van indices dat MySQL maar 1 index per query kan gebruiken. Losse indices op alle velden heeft dus weinig nut. Je zult per query moeten kijken wat je nodig hebt.
8)7 dus als je ergens een primary key op zet, kun je geen verdere indexen gebruiken?

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-05 18:53

Bosmonster

*zucht*

P_de_B schreef op dinsdag 21 december 2004 @ 11:35:
[...]


8)7 dus als je ergens een primary key op zet, kun je geen verdere indexen gebruiken?
Je kunt er zoveel aanmaken als je wilt, hij kan er alleen maar 1 gebruiken ;) Je zult dus indices van gecombineerde velden moeten maken (wil je iets hebben met een bepaalde eigenschap gesorteerd op datum, dan moet je een index maken met die eigenschap + datum).

Maak je ze los (index eigenschap + index datum) dan zal die er eentje uitzoeken die die leuk vindt :P

[ Voor 36% gewijzigd door Bosmonster op 21-12-2004 12:08 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Bosmonster schreef op dinsdag 21 december 2004 @ 12:07:
[...]


Je kunt er zoveel aanmaken als je wilt, hij kan er alleen maar 1 gebruiken ;) Je zult dus indices van gecombineerde velden moeten maken (wil je iets hebben met een bepaalde eigenschap gesorteerd op datum, dan moet je een index maken met die eigenschap + datum).

Maak je ze los (index eigenschap + index datum) dan zal die er eentje uitzoeken die die leuk vindt :P
offtopic:
Was jij dat niet met zo'n ernorme waslijst aan punten die nog "mankeerden" aan MySQL die opgelost "zouden moeten worden" alvoor het uberhaupt aan RDBMS gezien mocht worden? En zo ja, waar is die lijst te vinden? Ik heb er toendertijd dubbel om gelegen, en nu ik dit zo weer lees.. tja.. dan denk ik weer aan die lijst en wil ik 'm nog wel eens een keertje hebben :Y)

[ Voor 12% gewijzigd door RobIII op 21-12-2004 13:19 ]

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


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-05 18:53

Bosmonster

*zucht*

Dat was drm volgens mij...

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 17:30

TeeDee

CQB 241

RobIII schreef op dinsdag 21 december 2004 @ 13:18:
[...]

offtopic:
Was jij dat niet met zo'n ernorme waslijst aan punten die nog "mankeerden" aan MySQL die opgelost "zouden moeten worden" alvoor het uberhaupt aan RDBMS gezien mocht worden? En zo ja, waar is die lijst te vinden? Ik heb er toendertijd dubbel om gelegen, en nu ik dit zo weer lees.. tja.. dan denk ik weer aan die lijst en wil ik 'm nog wel eens een keertje hebben :Y)
offtopic:
afaik was dat ACM

Heart..pumps blood.Has nothing to do with emotion! Bored


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)

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


  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 13-01 07:19
Bosmonster schreef op dinsdag 21 december 2004 @ 11:29:
Bedenk bij het zetten van indices dat MySQL maar 1 index per query kan gebruiken. Losse indices op alle velden heeft dus weinig nut. Je zult per query moeten kijken wat je nodig hebt.
MySQL gebruikt 1 index voor de WHERE/GROUP BY/ORDER BY, maar hij kan wel per join nog een index gebruiken voor die join.

[ Voor 18% gewijzigd door _js_ op 21-12-2004 16:39 ]

Pagina: 1