Beste allen,
Voor een website, heb ik onderstaande query om een totaal te krijgen van de kolomwaarde 'area', gebaseerd op een specifieke code.
Voorbeeld inhoud tabel 'bc_parameter_difference':
Een scenario om e.e.a. te verduidelijken:
Stel ik wil per 'object_id' een totaal van 'area' voor de code '201':
Er zal dan gezocht moeten worden naar alle objecten waarvan de laatst ingevoerde code (hoogste sequence_id) '201' is. In de voorbeeldtabel hierboven zal dus alleen object_id = 23 geselecteerd moeten worden (immers is 200 de laatste code van object_id 25.
Vervolgens wil ik van object_id = 23 het totaal van de waarde 'Area' hebben.
Na veel proberen, heb ik dit bereikt met de volgende query.
Echter, het aantal records kan snel gaan oplopen (tot 100.000+), waardoor ik het idee heb dat de query erg traag gaat worden (met name door het gebruik van een subquery en IN() ).
Hebben jullie tips voor het optimaliseren van de query om de gewenste output snel te kunnen opvragen? Of kan ik de query beter opdelen?
Alvast bedankt voor jullie tips.
Voor een website, heb ik onderstaande query om een totaal te krijgen van de kolomwaarde 'area', gebaseerd op een specifieke code.
Voorbeeld inhoud tabel 'bc_parameter_difference':
sequence_id | object_id | code | parameter_name | parameter_value |
1 | 23 | 200 | area | 10 |
2 | 23 | 200 | area | 5 |
3 | 23 | 201 | area | 15 |
1 | 25 | 200 | area | 10 |
2 | 25 | 201 | area | 5 |
3 | 25 | 200 | area | 15 |
Een scenario om e.e.a. te verduidelijken:
Stel ik wil per 'object_id' een totaal van 'area' voor de code '201':
Er zal dan gezocht moeten worden naar alle objecten waarvan de laatst ingevoerde code (hoogste sequence_id) '201' is. In de voorbeeldtabel hierboven zal dus alleen object_id = 23 geselecteerd moeten worden (immers is 200 de laatste code van object_id 25.
Vervolgens wil ik van object_id = 23 het totaal van de waarde 'Area' hebben.
Na veel proberen, heb ik dit bereikt met de volgende query.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| SELECT d0.object_id, SUM(d0.parameter_value) AS values_sum, FROM bc_parameter_difference d0 WHERE d0.object_id IN ( SELECT d1.object_id FROM bc_parameter_difference d1 WHERE ( SELECT COUNT(*) FROM bc_parameter_difference d2 WHERE d2.object_id = d1.object_id AND d1.sequence_id <= d2.sequence_id ) <= 1 AND d1.project_id = 1 AND d1.code = 201 ORDER BY d1.object_id ASC, d1.sequence_id ASC ) AND d0.parameter_name = 'area' GROUP BY d0.object_id |
Echter, het aantal records kan snel gaan oplopen (tot 100.000+), waardoor ik het idee heb dat de query erg traag gaat worden (met name door het gebruik van een subquery en IN() ).
Hebben jullie tips voor het optimaliseren van de query om de gewenste output snel te kunnen opvragen? Of kan ik de query beter opdelen?
Alvast bedankt voor jullie tips.