PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Por que o limite de instrução preparada JDBC do PostgreSQL é padronizado para 5?


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.