sql >> Database >  >> RDS >> PostgreSQL

Ga naar sql - opgestelde instructiebereik

Voorbereide instructies zijn zo dat u repetitieve SQL-commando's kunt uitvoeren die bijvoorbeeld alleen in parameterwaarden mogen verschillen.

Ze zijn niet bedoeld om "lang" te leven zoals een voorbereide instructie kan (ze doen als ze worden aangeroepen vanuit een transactie) een actieve databaseverbinding reserveren ("lang" betekent wanneer ze niet worden gebruikt; het is prima om herhaaldelijk een voorbereide instructie uit te voeren, veel ook al duurt dit lang). Een verbinding is een dure hulpbron en mag alleen zo lang worden vastgehouden als nodig is. Door gewoon een heleboel voorbereide instructies te maken en ze niet te sluiten, kunt u geen actieve / toegestane verbindingen meer hebben en vervolgens verdere communicatie met de db-server blokkeren.

Gebruik een voorbereide instructie als u dezelfde insert . wilt uitvoeren , update of select statement met verschillende parameters meerdere keren in één (HTTP) verzoek. Gebruik geen voorbereide verklaring om (HTTP)-verzoeken te overleven.

In bepaalde driverimplementaties en databaseservers kunnen voorbereide statements ook resources omvatten die op de DB-server zelf zijn toegewezen (niet in de Go-toepassing). Een voorbereide instructie kan bijvoorbeeld vooraf worden gecompileerd op de DB-server en de server kan een plan voor het uitvoeren van query's opstellen en er bepaalde bronnen, zoals geheugen, aan toewijzen. Deze kunnen permanent worden gereserveerd totdat het voorbereide overzicht is gesloten.

Er is een artikel (gepost door Myles McDonnell in opmerkingen hieronder) over de implementatiedetails van Voorbereide verklaringen in Ga. Het vermeldt dat als voorbereide verklaringen niet van transacties worden gemaakt, ze de verbinding terug naar de verbindingspool vrijgeven, maar indien nodig proberen ze dezelfde opnieuw te gebruiken waarop ze zijn voorbereid (omdat als de db-server helpt / ook een actieve rol speelt in de voorbereide verklaring is het gebonden aan de verbinding aan de serverzijde). Zo niet, dan zullen ze zich opnieuw voorbereiden ze op een nieuwe verbinding (wat ongewenste prestatieoverhead veroorzaakt).

Al met al is wat u beschrijft een werkend model, en als u een klein aantal voorbereide instructies heeft die nodig zijn / worden uitgevoerd in veel volgende verzoeken, kunnen ze kortere responstijden betekenen. Maar het betekent ook dat ze er op de lange termijn toe kunnen leiden dat al uw voorbereide verklaringen worden opgesteld op alle verbindingen van de pool. Bepaal of dit in uw geval acceptabel is.

Over het algemeen moet dit worden vermeden (en de voorbereide verklaring moet worden gesloten vóór het einde van het HTTP-verzoek), maar als u er maar een paar hebt en u hebt ze nodig in veel verzoeken die elkaar opvolgen, kunt u ze buiten het bereik van het verzoek verplaatsen .




  1. Hoe u de meest relevante vermeldingen uit de database kunt krijgen en bestellen met meerdere trefwoorden Laravel 5

  2. django auth Gebruiker die e-mailveld afkapt

  3. Big Data met PostgreSQL en Apache Spark

  4. Tabellen die ik maak die beginnen met dotNetChat_ verdwijnen na het herstarten van MySQL