sql >> Databasteknik >  >> RDS >> PostgreSQL

Varför är tröskeln för PostgreSQL JDBC-förberedda uttalanden satt till 5 som standard?

Förberedda satser på serversidan förbrukar resurser på serversidan för att lagra exekveringsplanen för satsen. Tröskeln ger en heuristik som gör att uttalanden som faktiskt används "ofta" förbereds. Definitionen av "ofta" är som standard 5.

Observera att förberedda uttalanden på serversidan kan orsaka dåliga exekveringsplaner eftersom de inte är baserade på parametrarna som skickades under förberedelsen. Om parametrarna som skickas till en förberedd sats har en annan selektivitet på ett visst index (till exempel), kan den allmänna frågeplanen för den beredda satsen vara suboptimal. Som ett annat exempel, om du har en situation där exekveringen av frågan är mycket större än kostnaden för att skapa en förklara-plan, och förklara-planen inte är korrekt inställd på grund av brist på bindningsparametrar, kan du vara bättre att inte använda förberedda uttalanden på serversidan.

När föraren når tröskeln kommer den att förbereda uttalandet enligt följande:

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

Uttalandets namn skickas som en del av trådprotokollet, vilket säger till Postgres att förbereda den på serversidan.



  1. PHP MySQL över SSL. Kamratcertifikat stämde inte

  2. Knee-Jerk Wait Statistik:SOS_SCHEDULER_YIELD

  3. PDO kastar fel om MYSQL_ATTR_INIT_COMMAND används

  4. hur man får värden för samma kolumnnamn från två olika tabeller i SQL