Ik roep een functie aan als onderdeel van een distinct select. De query geeft de goede resultaten uit, alleen worden éérst alle rijen opgebouwd en pas daarna met distinct de rijen gefilterd. Hierdoor wordt de functie te vaak aangeroepen.
Voorbeeldquery:
De query geeft zoals gezegd netjes voor elke project_set een rij terug. De functie wordt echter net zo vaak aangeroepen als er rijen matchen in project_item.
Ik heb al geprobeerd de functie als STABLE te markeren. Volgens de postgresql documentatie zou de queryplanner de functie dan maar één keer aan moeten roepen met dezelfde parameters (omdat de uitvoer dan hetzelfde zou moeten zijn). Dit heeft echter geen effect.
Hoe kan ik ervoor zorgen dat de functie maar één keer per project_set wordt aangeroepen?
Voorbeeldquery:
SQL:
1
2
3
4
5
6
7
8
9
10
11
| SELECT DISTINCT ON (project_set.psid) project_set.set_name AS set_name, scorecard_person_get_set_result(scorecard.scid, person_id, project_set.psid) AS set_result FROM project_set JOIN scorecard ON project_set.fk_pid = scorecard.fk_pid JOIN project_item ON project_set.psid = project_item.fk_psid AND scorecard.score_date BETWEEN project_item.start_date AND project_item.end_date WHERE scorecard.scid = scorecard_id; |
De query geeft zoals gezegd netjes voor elke project_set een rij terug. De functie wordt echter net zo vaak aangeroepen als er rijen matchen in project_item.
Ik heb al geprobeerd de functie als STABLE te markeren. Volgens de postgresql documentatie zou de queryplanner de functie dan maar één keer aan moeten roepen met dezelfde parameters (omdat de uitvoer dan hetzelfde zou moeten zijn). Dit heeft echter geen effect.
Hoe kan ik ervoor zorgen dat de functie maar één keer per project_set wordt aangeroepen?
Ik ontken het bestaan van IE.