sql >> Database >  >> RDS >> PostgreSQL

Waarom is de door PostgreSQL JDBC voorbereide instructiedrempel standaard ingesteld op 5?

Voorbereide instructies aan de serverzijde verbruiken bronnen aan de serverzijde om het uitvoeringsplan voor de instructie op te slaan. De drempel biedt een heuristiek die ervoor zorgt dat uitspraken worden voorbereid die eigenlijk "vaak" worden gebruikt. De definitie van "vaak" is standaard 5.

Houd er rekening mee dat door de server voorbereide instructies slechte uitvoeringsplannen kunnen veroorzaken, omdat ze niet zijn gebaseerd op de parameters die tijdens de voorbereiding zijn doorgegeven. Als de parameters die worden doorgegeven aan een voorbereide instructie een andere selectiviteit hebben op een bepaalde index (bijvoorbeeld), dan kan het algemene queryplan van de voorbereide instructie niet optimaal zijn. Als een ander voorbeeld, als u een situatie hebt waarin de uitvoering van de query veel hoger is dan de kosten om een ​​uitlegplan te maken, en het uitlegplan niet correct is ingesteld vanwege een gebrek aan bindingsparameters, kunt u er beter aan doen om het niet te gebruiken door de server opgestelde verklaringen.

Wanneer de bestuurder de drempel bereikt, zal hij de verklaring als volgt voorbereiden:

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

De naam van de instructie wordt verzonden als onderdeel van het wire-protocol, dat Postgres vertelt om het server-side voor te bereiden.



  1. 7-stappenhandleiding voor het gebruik van toegang met Azure Multi-Factor Authentication

  2. Oracle-fout ORA-28759:kan bestand niet openen bij het aanvragen van utl_http-pakket

  3. Hoe de resultaten van een Oracle-query te ontvouwen op basis van de waarde van een kolom?

  4. Mysql_real_escape_string() Waarschuwing Verwarring