As instruções preparadas do lado do servidor consomem recursos do lado do servidor para armazenar o plano de execução da instrução. O limite fornece uma heurística que faz com que as declarações que são realmente usadas "frequentemente" sejam preparadas. A definição de "frequentemente" tem como padrão 5.
Observe que as instruções preparadas do lado do servidor podem causar planos de execução ruins porque não são baseadas nos parâmetros passados durante a preparação. Se os parâmetros passados para uma instrução preparada tiverem uma seletividade diferente em um índice específico (por exemplo), o plano geral de consulta da instrução preparada pode ser subótimo. Como outro exemplo, se você tiver uma situação em que a execução da consulta é muito maior do que o custo para criar um plano de explicação e o plano de explicação não está definido corretamente devido à falta de parâmetros de ligação, talvez seja melhor não usar instruções preparadas do lado do servidor.
Quando o driver atingir o limite, ele preparará a instrução da seguinte forma:
if (!oneShot)
{
// Generate a statement name to use.
statementName = "S_" + (nextUniqueID++);
// And prepare the new statement.
// NB: Must clone the OID array, as it's a direct reference to
// the SimpleParameterList's internal array that might be modified
// under us.
query.setStatementName(statementName);
query.setStatementTypes((int[])typeOIDs.clone());
}
O nome da instrução é enviado como parte do protocolo wire, que informa ao Postgres para prepará-lo no lado do servidor.