sql >> Database >  >> RDS >> Oracle

Of de prestaties van invloed zijn wanneer de databaseprocedure vaak vanuit de toepassing wordt aangeroepen?

Uw advies is correct, het is beter om alle databasetaken in één keer uit te voeren. Er zijn 2 grote prestatie-effecten in uw scenario

  1. De contextwisseling van pro*c tussen de SQL-engine en de PL/SQL-engine om uw threads meerdere keren uit te voeren. Meestal het grootste probleem bij veel PL/SQL-aanroepen vanuit een clienttoepassing.
  2. De Network Stack Overhead (TNS) in de communicatie tussen uw pro*c-app en de database-engine, vooral als uw app zich op een andere fysieke host bevindt.

Dat gezegd hebbende, maak je een verbindingspool aan het einde van de applicatie. De TNS-luisteraar zou ook een pool van nagelaten serverschaduwprocessen moeten hebben die wachten op elke netwerkverbinding (dit is ingesteld op listener.ora).

De OCI-aanmelding/afmelding wanneer het schaduwproces al wacht op verbinding is erg snel en geen grote factor in latentie - ik maak me hier geen zorgen over tenzij een nieuw schaduwproces op de server moet opstarten - dan kan het een erg duur bellen. Aangezien u verbindingspooling aan de clientzijde gebruikt, is dit meestal geen probleem, maar gewoon iets om te overwegen vanwege de threading in uw oproepen. Als je eenmaal de pool van serverschaduwprocessen hebt uitgeput, zul je een enorme achteruitgang opmerken als de TNS-luisteraar meer serverschaduwprocessen moet opstarten.

Bewerken als antwoord op de nieuwe vragen:

  1. Het is erg gerelateerd. Zoals eerder aangegeven, moet u het aantal plsql- en sql-aanroepen binnen uw C++-app minimaliseren. Elke PLSQL-aanroep binnen uw C++ app-aanroep roept de SQL-engine aan die vervolgens de PLSQL-engine aanroept voor de procedure-aanroep. Dus als je je procedure in 2 splitst, verdubbel je de SQL naar PLSQL-contextswitches, wat de duurdere switch is zoals beschreven in het Tom Kyte-artikel en mijn eigen persoonlijke ervaring.

  2. Wordt beantwoord in 1. Maar zoals ik al eerder zei, komt de communicatie-overhead op de tweede plaats, tenzij uw hosts zich op verschillende fysieke netwerken bevinden en de soorten gegevens die u overdraagt. Grote C++-objectparameters en grote Oracle-resultatensets met veel aanroepen hebben bijvoorbeeld duidelijk invloed op de communicatielatentie bij retourvluchten. Onthoud dat met meer PLSQL-aanroepen u ook meer SQLNET-verkeer toevoegt voor de installatie voor elke verbinding en resultaatset.

  3. er is geen 3. vraag

  4. PLSQL naar SQL binnen de PLSQL-engine is te verwaarlozen, dus blijf er niet in hangen. Plaats al uw SQL-aanroepen binnen 1 PLSQL-aanroep voor maximale prestatiedoorvoer. Splits de gesprekken niet alleen maar om welsprekender te zijn tegen de dure prestaties.




  1. Laatste bericht in een berichtenreeks weergeven

  2. Waarom invoegen-selecteren naar variabele tabel van XML-variabele zo traag?

  3. Mijn app spring+hibernate sluit geen jdbc-verbindingen

  4. Tabel wijzigen met subselectie