Op mijn werk liep ik tegen een probleem met traagheid aan. Een complexe query verzamelt data uit een aantal tabellen met joins en left joins. Nu er 400 artikelen in zijn gevoerd.
De query wordt traag, zodra deze wordt uitgevoerd in het kader van een zoek-functie. De zoek-functie zoekt in bijvoorbeeld de naam.
Trage situatie: Aan het eind van de query staat een where-clause met de zoek-string, zoals "WHERE (naam LIKE ?) AND (producent_naam LIKE ?)".
Die traagheid heb ik simpelweg op kunnen lossen, door de where-clause helemaal achter wege de laten en de zoek-criteria bij de joins van de betreffende tabel te plaatsen achter ON, dus bijvoorbeeld ON ... AND (naam LIKE ?). En opeens gaat de query meer dan 100 keer zo snel!
Het aantal artikelen kan de oorzaak niet zijn, 400 is niets.
Met Googlen kon ik niet echt een sluitende verklaring vinden. Wel andere ervaringen met betere prestaties dmv. verplaatsing van WHERE-claude naar ON ...
Ik vond nog wel een derde alternatief: Een subquery icm. JOIN
Bron: http://www.itjungle.com/fhg/fhg111407-story01.html
Wat is het beste?
Toen ik de query schreef, twijfelde ik al of ik het nou bij de ON of in de WHERE-clause zou plaatsen. Gekozen voor de WHERE-claude en de ON alleen gebruikt voor koppeling tussen tabellen. Nu ik een gevulde database heb, heb ik kunnen ontdekken dat dit niet de beste manier is.
Is er een bepaalde regel? Geldt altijd dat je zoveel mogelijk bij ON moet onderbrengen bij joins?
De query wordt traag, zodra deze wordt uitgevoerd in het kader van een zoek-functie. De zoek-functie zoekt in bijvoorbeeld de naam.
Trage situatie: Aan het eind van de query staat een where-clause met de zoek-string, zoals "WHERE (naam LIKE ?) AND (producent_naam LIKE ?)".
Die traagheid heb ik simpelweg op kunnen lossen, door de where-clause helemaal achter wege de laten en de zoek-criteria bij de joins van de betreffende tabel te plaatsen achter ON, dus bijvoorbeeld ON ... AND (naam LIKE ?). En opeens gaat de query meer dan 100 keer zo snel!
Het aantal artikelen kan de oorzaak niet zijn, 400 is niets.
Met Googlen kon ik niet echt een sluitende verklaring vinden. Wel andere ervaringen met betere prestaties dmv. verplaatsing van WHERE-claude naar ON ...
Ik vond nog wel een derde alternatief: Een subquery icm. JOIN
code:
1
2
3
4
5
6
7
| SELECT H.INVOICE, H.COMPANY, H.CUSTNBR, H.INVDATE, D.LINE, D.ITEM, D.QTY FROM INVHDR AS H LEFT JOIN (SELECT * FROM INVDTL WHERE ITEM = 'AB1441') AS D ON H.INVOICE = D.INVOICE |
Bron: http://www.itjungle.com/fhg/fhg111407-story01.html
Wat is het beste?
Toen ik de query schreef, twijfelde ik al of ik het nou bij de ON of in de WHERE-clause zou plaatsen. Gekozen voor de WHERE-claude en de ON alleen gebruikt voor koppeling tussen tabellen. Nu ik een gevulde database heb, heb ik kunnen ontdekken dat dit niet de beste manier is.
Is er een bepaalde regel? Geldt altijd dat je zoveel mogelijk bij ON moet onderbrengen bij joins?