PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Warum ist der PostgreSQL JDBC-Vorbereitungsschwellenwert standardmäßig auf 5 eingestellt?

Serverseitig vorbereitete Anweisungen verbrauchen serverseitige Ressourcen, um den Ausführungsplan für die Anweisung zu speichern. Der Schwellwert stellt eine Heuristik bereit, die bewirkt, dass tatsächlich "häufig" verwendete Aussagen erstellt werden. Die Definition von „oft“ ist standardmäßig 5.

Beachten Sie, dass serverseitig vorbereitete Anweisungen schlechte Ausführungspläne verursachen können, da sie nicht auf den während der Vorbereitung übergebenen Parametern basieren. Wenn die an eine vorbereitete Anweisung übergebenen Parameter eine andere Selektivität für einen bestimmten Index aufweisen (z. B.), ist der allgemeine Abfrageplan der vorbereiteten Anweisung möglicherweise nicht optimal. Wenn Sie beispielsweise eine Situation haben, in der die Ausführung der Abfrage viel größer ist als die Kosten für die Erstellung eines EXPLAIN-Plans und der EXPLAIN-Plan aufgrund fehlender Bindungsparameter nicht richtig festgelegt ist, sollten Sie möglicherweise besser darauf verzichten serverseitig vorbereitete Anweisungen.

Wenn der Fahrer die Schwelle erreicht, bereitet er die Anweisung wie folgt vor:

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

Der Anweisungsname wird als Teil des Wire-Protokolls gesendet, das Postgres anweist, es serverseitig vorzubereiten.