[pgsql] DISTINCT query roept functie meerdere malen aan

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
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:

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.


Acties:
  • 0 Henk 'm!

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Waar komt 'scorecard_id' vandaan? Zoek je het resultaat van 1 scorecard?

Skill is when luck becomes a habit.


Acties:
  • 0 Henk 'm!

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
De query wordt gedraait vanuit een functie. scorecard_id is een variabele.

Ik ontken het bestaan van IE.


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

cyberstalker schreef op dinsdag 14 april 2009 @ 16:21:
Hoe kan ik ervoor zorgen dat de functie maar één keer per project_set wordt aangeroepen?
Door hem een niveau hoger pas te bepalen. Bijvoorbeeld door dat je je huidige query als subquery van een nieuwe opbouwt, met zoiets:

SQL:
1
2
3
4
SELECT psid, name, scorecard(..., psid)
FROM
( SELECT DISTINCT ON (psid), name, ...
 FROM ... ) as sub


Distinct wordt nou eenmaal pas over de uiteindelijke dataset losgelaten, niet al halverwege ofzo. Je zou kunnen kijken of het met GROUP BY wel later gebeurt, maar ook dat betwijfel ik en er is in ieder geval geen garantie dat dat later pas gebeurt.