PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Perché la soglia dell'istruzione preparata JDBC di PostgreSQL è impostata su 5 per impostazione predefinita?

Le istruzioni preparate lato server consumano risorse lato server per archiviare il piano di esecuzione per l'istruzione. La soglia fornisce un'euristica che determina la preparazione di istruzioni effettivamente utilizzate "spesso". La definizione di "spesso" è predefinita su 5.

Si noti che le istruzioni preparate lato server possono causare piani di esecuzione scadenti perché non sono basate sui parametri passati durante la preparazione. Se i parametri passati a un'istruzione preparata hanno una selettività diversa su un particolare indice (ad esempio), il piano di query generale dell'istruzione preparata potrebbe non essere ottimale. Come altro esempio, se hai una situazione in cui l'esecuzione della query è molto maggiore del costo per creare un piano di spiegazione e il piano di spiegazione non è impostato correttamente a causa della mancanza di parametri di associazione, è meglio non utilizzare istruzioni preparate lato server.

Quando il conducente raggiunge la soglia, preparerà la dichiarazione come segue:

    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());
    }

Il nome dell'istruzione viene inviato come parte del protocollo wire, che dice a Postgres di prepararlo lato server.