PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Go sql - portée de l'instruction préparée

Les instructions préparées vous permettent d'exécuter des commandes SQL répétitives qui ne peuvent différer que par les valeurs des paramètres, par exemple.

Ils ne sont pas destinés à vivre "longtemps" car une instruction préparée peut (elle le fait si elle est appelée à partir d'une transaction) réserver une connexion active à la base de données ("long" signifie lorsqu'elle n'est pas utilisée ; il est parfaitement acceptable d'exécuter de manière répétitive une instruction préparée de nombreuses fois même si cela prendra du temps). Une connexion est une ressource coûteuse et ne doit être maintenue que le temps nécessaire. En créant simplement un tas d'instructions préparées et en ne les fermant pas, vous pourriez manquer de connexions actives/autorisées, puis bloquer toute communication ultérieure avec le serveur de base de données.

Utilisez une instruction préparée si vous souhaitez exécuter le même insert , update ou select déclaration avec différents paramètres plusieurs fois dans une requête (HTTP). N'utilisez pas d'instruction préparée pour survivre aux requêtes (HTTP).

Dans certaines implémentations de pilotes et serveurs de base de données, les instructions préparées peuvent également impliquer des ressources allouées sur le serveur de base de données lui-même (pas dans l'application Go). Par exemple, une instruction préparée peut être pré-compilée sur le serveur de base de données et le serveur peut préparer un plan d'exécution de requête, lui allouer certaines ressources telles que la mémoire. Ceux-ci peuvent être réservés de façon permanente jusqu'à ce que le relevé préparé soit fermé.

Il y a un article (posté par Myles McDonnell dans les commentaires ci-dessous) qui détaille la mise en œuvre de Prepared Statements en Go. Il mentionne que si les instructions préparées ne sont pas créées à partir de transactions, elles libèrent la connexion vers le pool de connexions, mais si nécessaire, elles essaient de réutiliser la même sur laquelle elles ont été préparées (car si le serveur de base de données aide / joue également un rôle actif dans l'instruction préparée, il est lié à la connexion côté serveur). Sinon, ils vont re-préparer les connecter sur une nouvelle connexion (entraînant une surcharge de performances indésirable).

Dans l'ensemble, ce que vous décrivez est un modèle de travail, et si vous avez un faible nombre d'instructions préparées qui sont nécessaires/exécutées dans de nombreuses requêtes ultérieures, elles peuvent signifier des temps de réponse plus courts. Mais cela signifie également que d'un autre côté, à long terme, ils pourraient avoir pour conséquence que toutes vos instructions préparées seront préparées sur toutes les connexions du pool. Décidez si cela est acceptable dans votre cas.

En général, cela devrait être évité (et l'instruction préparée doit être fermée avant la fin de la requête HTTP), mais si vous n'en avez que quelques-unes et que vous en avez besoin dans de nombreuses requêtes consécutives, vous pouvez les déplacer hors de la portée de la requête. .