O PostgreSQL documenta seu Set Returning Functions com extensões C como esta ,
As funções da linguagem C têm duas opções para retornar conjuntos (várias linhas).
- Em um método, chamado
ValuePerCall
mode , uma função de retorno de conjunto é chamada repetidamente (passando os mesmos argumentos a cada vez) e retorna uma nova linha em cada chamada, até não ter mais linhas para retornar e sinalizar isso retornando NULL. A função de retorno de conjunto (SRF) deve, portanto, salvar estado suficiente nas chamadas para lembrar o que estava fazendo e retornar o próximo item correto em cada chamada.- No outro método, chamado
Materialize
mode , um SRF preenche e retorna um objeto tuplestore contendo todo o seu resultado; então ocorre apenas uma chamada para todo o resultado e nenhum estado entre chamadas é necessário.
Se você estiver otimizando para velocidade de execução, qual é mais rápido ValuePerCall
ou Materialize
modo? Obviamente, o modo Materialize levará mais memória, mas parece que deve ser mais rápido se seu objetivo for retornar um conjunto inteiro, mas não vejo isso documentado em nenhum lugar.
Estes parecem estar documentados no código como Set Returning Function Mode SFRM_ValuePerCall
e SFRM_Materialize
.
Eu avaliei isso muito bem com meus projetos. Aqui está o que eu encontrei,
work_mem
Materialize
em umaFROM
cláusula.ValuePerCell
em umaSELECT
lista e para conjuntos com uma extensãoLIMIT
.Você pode ver meus benchmarks no meu repositório
pg-srf-repeat-benchmark
Há também
SFRM_Materialize_Preferred
que permite que você escreva uma função que aceite uma dica do chamador e faça as duas coisas.