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

Hvorfor er tærskelværdien for PostgreSQL JDBC-forberedte erklæringer som standard sat til 5?

Forberedte sætninger på serversiden bruger ressourcer på serversiden til at gemme eksekveringsplanen for sætningen. Tærsklen giver en heuristik, der gør, at udsagn, der faktisk bruges "ofte", bliver udarbejdet. Definitionen af ​​"ofte" er som standard 5.

Bemærk, at forberedte sætninger på serversiden kan forårsage dårlige eksekveringsplaner, fordi de ikke er baseret på de parametre, der blev videregivet under forberedelsen. Hvis parametrene, der sendes til en forberedt erklæring, har en anden selektivitet på et bestemt indeks (for eksempel), så kan den generelle forespørgselsplan for den forberedte sætning være suboptimal. Som et andet eksempel, hvis du har en situation, hvor udførelsen af ​​forespørgslen er meget større end omkostningerne ved at oprette en forklaringsplan, og forklaringsplanen ikke er korrekt indstillet på grund af mangel på bindeparametre, kan du være bedre stillet til ikke at bruge serverside forberedte erklæringer.

Når føreren når tærsklen, vil den forberede erklæringen som følger:

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

Udsagnsnavnet sendes som en del af wire-protokollen, som fortæller Postgres at forberede den på serversiden.



  1. PlanetScale &Vitess:Referenceintegritet med ældre delte databaser

  2. filter mysql-replikation (ignore-db)

  3. SqlBulkCopy tilsvarende i MySql?

  4. MySQL:vælg forespørgsel, 5 minutters intervaller