[Access SQL] Supertrage query, hoe sneller?

Pagina: 1
Acties:

  • Banaan
  • Registratie: Maart 2000
  • Laatst online: 19-05 12:27
Ik zit met een probleem waar ik niet zo 1 2 3 uit kom. Ik heb hier een Access database (nee overstappen naar een fatsoenlijke database is helaas geen optie, net zomin dat ik de types van de kolommen kan veranderen), maar daarin de volgende twee tabellen:

TabelA: (alleen relevante kolommen)
cr (Type: Text, NULL values allowed)
zp (Type: Text, NULL values allowed)
Aantal records: 230.000 en groeiend

TabelB: (alleen relevante kolommen)
contractrekening (Type: Text, NULL values allowed)
businesspartner (Type: Text, NULL values allowed)
Aantal records: 54.582, stabiel
Opmerking: Beide kolommen zijn niet UNIQUE, maar de combinatie van beide wel

Wat wil ik? Ik wil alle records uit tabelA die voldoen aan:
1. TabelA.zp = TabelB.businesspartner AND TabelA.cr IS NULL
2. TabelA.cr = TabelB.contractrekening AND TabelA.zp IS NULL
3. TabelA.zp = TabelB.businesspartner AND TabelA.cr = TabelB.contractrekening

Daarvoor had ik drie query's, waarvan ik de query voor optie 1 hier plaats:
SELECT *
FROM TabelA
WHERE TabelA.zp IN (SELECT DISTINCT businesspartner FROM TabelB)
AND TabelA.cr IS NULL

Als ik deze query echter draai, dan hangt of Access, of ik kan wachten tot ik een ons weeg. Blijkbaar is Access hier niet zo happy mee. Heeft iemand een idee hoe ik deze query's kan herschrijven om wel het gewenste resultaat te krijgen zonder meer dan een paar minuten te moeten wachten?

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

Je kan eens kijken naar JOINS

P&W FAQ - SQL

Hoewel ik niet weet of de SQL parser van MS Access ook al vrij intelligent is en de subquery vanzelf al vertaald naar een join. :)

Echter, onder de conditie:
1. Geen andere db
2. Geen veldtypes wijzigen
3. 230k regels

Denk ik niet dat je het veel sneller zal gaan krijgen. :)

Daarnaast heb ik het vermoeden dat
SQL:
1
SELECT DISTINCT businesspartner FROM TabelB

duidt op een niet optimaal genormaliseerde database, met veel redunante data.

[ Voor 47% gewijzigd door gorgi_19 op 20-08-2004 12:35 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Waarom niet zo?

code:
1
2
3
4
SELECT TabelA.*
FROM TabelA, TabelB
WHERE TabelA.zp = TabelB.businesspartner 
AND TabelA.cr IS NULL


Met eventueel een DISTINCT

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Probeer dit eens:
code:
1
2
3
4
SELECT *
FROM TabelA
WHERE EXISTS (SELECT 'dummy' FROM TabelB WHERE TabelB.businesspartner = TabelA.zp)
AND TabelA.cr IS NULL


De kolom businesspartner in tabelB moet dan wel een index hebben.

Who is John Galt?


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 23-05 21:33
t moet niet.. maar zou wel n stuk vlotter gaan :P

  • Banaan
  • Registratie: Maart 2000
  • Laatst online: 19-05 12:27
Kijk eens aan, dit is uhm! Deze gaat redelijk rap (zelfs met de 3 opties tegelijk), dus hartelijk dank!
justmental schreef op 20 augustus 2004 @ 13:09:
Probeer dit eens:
code:
1
2
3
4
5
6
7
SELECT *
FROM TabelA
WHERE EXISTS (
SELECT 'dummy' 
FROM TabelB 
WHERE TabelB.businesspartner = TabelA.zp)
AND TabelA.cr IS NULL


De kolom businesspartner in tabelB moet dan wel een index hebben.
Pagina: 1