Query uitvoeren neemt veel tijd

Status
Niet open voor verdere reacties.

RobertJB66

Gebruiker
Lid geworden
2 feb 2022
Berichten
132
Zou iemand mij aan kunnen geven waarom de uitvoer van de onderstaande Query veel tijd kost. ca 15 seconde.
De tabel waar naar gekeken wordt heeft maar 750 records/regels. De tabel heeft wel per regel 40 items

SELECT Charge, PRID, Age
FROM EECQ WHERE (PRID In (SELECT Max(PRID) As MaxPRID FROM EECQ
GROUP BY Charge)) ORDER BY Age ASC

PRID is het unieke nummer per regel
Charge is het charge of batch nummer
Age is de leeftijd van die tegel op dit moment in dagen

Is er een andere SQL statement dat een sneller resultaat oplevert?
 
Plaats de database eens hier, een kopie met alleen de tabel EECQ voldoet.
 
Een subquery in een query werkt altijd wel vertragend, zeker als je daar VBA functies in gebruikt. Er zijn betere methodes om de hoogste waarde in een subquery te gebruiken. Maar een voorbeeld bestandje werkt natuurlijk altijd beter dan zo een antwoord uit de lucht te slaan.
 
enkele algemene aanbevelingen voor query performantie op de meeste databases:

* vermijd het gebruik van subqueries: voor elke resultaatregel in de query dient de subquery uitgevoerd worden. Op dat moment kan de query niet meer in batch uitgevoerd worden, maar moet regel per regel verwerkt worden. In jou geval gebruik je bv. een CTE (Common Table Expression) zoals (syntax = standaard T-SQL, voor Access tabellen kan dit afwijken)
Code:
;
With qry1(max_PRID) as (SELECT Max(PRID) FROM EECQ
GROUP BY Charge)

Select Charge, PRID, Age from EECQ inner join qry1 on PRID = max_PRID
Order by Age Asc
als dit niet kan in Access: maak een aparte query van je subquery en koppel deze in je resultaatquery aan de tabel


* gebruik de juiste indexen. Voor jou query zou ik een index leggen op EECQ (PRID, Age, Charge) Indien in je database de optie bestaat kan je de van laatste 2 kolommen included kolommen maken.
 
Maak drie query's.
Query1:
SELECT Charge, PRID, Age
FROM EECQ;


Query2:
SELECT Max(PRID) AS MaxPRID
FROM EECQ
GROUP BY Charge;


QueryJoin:
SELECT [Query1].Charge, [Query1].PRID, [Query1].Age
FROM Query1
INNER JOIN Query2 ON [Query1].PRID=[Query2].MaxPRID
ORDER BY [Query1].Age;

Maar een tabelletje van slechts 750 records stelt geen hoge eisen aan een query, ook jouw query zou binnen een seconde resultaat moeten opleveren.
 
als dit niet kan in Access:
Je gaat toch niet beweren dat je nog nooit met Access hebt gewerkt? Natuurlijk kan dit niet in Access :).

@ahhulpje: het kan gewoon met twee queries. Dat ene record met een aparte query opvragen en die koppelen aan je andere query. Krijg je zoiets:
Code:
[COLOR=#333333]SELECT Charge, PRID, Age [/COLOR][COLOR=#333333]FROM EECQ, MaxPrID
WHERE [/COLOR][COLOR=#333333]EECQ.[/COLOR][COLOR=#333333]PRID =[/COLOR][COLOR=#333333]MaxPrID.[/COLOR][COLOR=#333333]MaxPRID[/COLOR]
[COLOR=#333333]ORDER BY Age ASC[/COLOR]
Overigens ligt het snelheidsprobleem denk ik ergens anders; ik het twee testen gedaan met een tabel met 9000 records (en dat is dus wel ietsje meer) en beide varianten draaiden nog geen halve seconde. Access kan echt wel uit de voeten met een subquery of met de functie Max. Zeker als die subquery maar één record oplevert.
 
@AccessGuru

Mijn Query2 levert meer dan één record op, ik zie dus niet in hoe jouw query zou moeten werken (dat doet hij dus ook niet).
 
TS heeft z'n query een beetje onhandig neergepend, ik las 'm niet helemaal juist. Bij meerdere waarden is een Inner Join uiteraard prima. Neemt niet weg dat het nog steeds met twee queries kan. Die eerste van jou doet namelijk helemaal niets.
Dus dan krijg je zoiets:

Query 1:
Code:
[COLOR=#333333]SELECT Max(PRID) AS MaxPRID, Charge[/COLOR]
[COLOR=#333333]FROM EECQ[/COLOR]
[COLOR=#333333]GROUP BY Charge;[/COLOR]

Query 2:
Code:
[COLOR=#333333]SELECT Charge, PRID, Age [/COLOR][COLOR=#333333]FROM EECQ, MaxPrID
WHERE [/COLOR][COLOR=#333333]EECQ.[/COLOR][COLOR=#333333]PRID =[/COLOR][COLOR=#333333]MaxPrID.[/COLOR][COLOR=#333333]MaxPRID AND [/COLOR]EECQ.Charge=MaxPrID.Charge
[COLOR=#333333]ORDER BY Age ASC[/COLOR]
 
Die JOIN op Charge mag toch weg?
En voor de duidelijkheid voor de TS: jouw Query 1 is opgeslagen als MaxPrID, en daar wordt dus aan gerefereerd in jouw Query 2.
 
als ik de originele boodschap bekijk heeft de tabel 750 regels en elke regel 40 items = 30.000 lijnen in EECQ? Dat strookt ook met de info PRID = unieke nummer van de regel en je zoekt de max(PRID) , als er maar één zou zijn dan hoef je niet de max te nemen. Dus ik neem aan dat EECQ een view of zo is.
 
Zouden die 40 items niet 40 kolommen kunnen zijn?
Misschien moet de TS nu wat van zich laten horen.
 
Laatst bewerkt:
Plaats de database eens hier, een kopie met alleen de tabel EECQ voldoet.

Het probleem dat ik heb met een voorbeeld database is dat de data base een SQL tabel is en ik deze link in Access.
In Access maak ik dan Queries die ik gebruik voor het weer geven van de data in tabellen en rapporten.

Als iemand een idee heeft hoe ik een deel van mijn programma met een tabel kan exporteren voor een voorbeeld dan doe ik dat graag.
 
Zouden die 40 items niet 40 kolommen kunnen zijn?
Misschien moet de TS nu wat van zich laten horen.

Ik hoop dat ik de juiste benamingen geef.

Als ik naar de tabel kijk zie ik 750 regels onder elkaar op iedere regel staan 40 items. Die 40 zouden dan 40 kolommen zijn. de data van één regel hoort bij één registratie.
lijkt dit er meer op?:rolleyes:
 
Je gaat toch niet beweren dat je nog nooit met Access hebt gewerkt? Natuurlijk kan dit niet in Access :).

@ahhulpje: het kan gewoon met twee queries. Dat ene record met een aparte query opvragen en die koppelen aan je andere query. Krijg je zoiets:
Code:
[COLOR=#333333]SELECT Charge, PRID, Age [/COLOR][COLOR=#333333]FROM EECQ, MaxPrID
WHERE [/COLOR][COLOR=#333333]EECQ.[/COLOR][COLOR=#333333]PRID =[/COLOR][COLOR=#333333]MaxPrID.[/COLOR][COLOR=#333333]MaxPRID[/COLOR]
[COLOR=#333333]ORDER BY Age ASC[/COLOR]
Overigens ligt het snelheidsprobleem denk ik ergens anders; ik het twee testen gedaan met een tabel met 9000 records (en dat is dus wel ietsje meer) en beide varianten draaiden nog geen halve seconde. Access kan echt wel uit de voeten met een subquery of met de functie Max. Zeker als die subquery maar één record oplevert.

Als ik de routine laat lopen in step mode. Dan zie ik dat zodra ik met F8 de regel met deze code laat uitvoeren dat ik ca. 15 seconde moet wachten voor dat ik met F8 naar de volgende regel kan.
Is er een mogelijkheid om te kijken wat mogelijk de oorzaak kan zijn van deze vertraging?:eek:
 
Heb je je query nou aangepast of niet?
Het is voor ons ook niet mogelijk om jouw situatie na te bootsen, je voert de Accessquery uit op een externe database (MSSQL Server, MySQL, Oracle,...?) waardoor allerlei connectie vertragingen kunnen optreden.
 
Maar toch stiekem weggehaald uit je WHERE clause. :)
 
Als ik de routine laat lopen in step mode. Dan zie ik dat zodra ik met F8 de regel met deze code laat uitvoeren dat ik ca. 15 seconde moet wachten voor dat ik met F8 naar de volgende regel kan.
Op geen enkel moment heb je aangegeven dat je de query draait via VBA. Dat verandert de zaak wellicht, want nu is het helemaal onduidelijk hoe je precies te werk gaat. Nu willen we zeker de database zien :).
Daarnaast wekte je de indruk dat de complete query 15 seconden bezig was, en nu wek je de indruk dat die tijd per record gebruikt wordt. Dus dan wordt de complete query in 15*750 seconden uitgevoerd, zeg maar ruim 3 uur. Dat is absurd.

Als je van de gewenste tabel een Access kopie kan maken, kun je de database best posten. Je maakt dan eerst een Access tabel met in ieder geval de gewenste velden, en daarna maak je een toevoegquery om de SQL database tabel naar de Access tabel te kopiëren. En die database kun je dan zippen en posten. Ik zou de SQL tabel dan weghalen, om verwarring te voorkomen. Als je dat doet, kun je de tabel dezelfde naam geven als de gekoppelde tabel, en dan hoef je verder ook niet zoveel te veranderen. Je gebruikt dan een lokale tabel, en niet meer de gekoppelde tabel.
 
Met F8 naar de volgende regel van de VBA-code, niet naar het volgende record, dus 15 seconden voor de hele query, al is dat nog veel te lang.
Ik ben bang (en weet het eigenlijk wel zeker) dat als de SQL Server tabel een lokale tabel in de Accessdatabase wordt, de query ruim binnen de seconde wordt uitgevoerd.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan