sql >> Base de Datos >  >> RDS >> PostgreSQL

Go sql - alcance de declaración preparada

Las declaraciones preparadas son para que pueda ejecutar comandos SQL repetitivos que solo pueden diferir en los valores de los parámetros, por ejemplo.

No están destinados a vivir "por mucho tiempo", ya que una declaración preparada puede (lo hacen si se llama desde una transacción) reservar una conexión de base de datos activa ("larga" significa cuando no se usan; está perfectamente bien ejecutar repetidamente una declaración preparada muchas veces incluso si esto tomará mucho tiempo). Una conexión es un recurso costoso y solo debe mantenerse mientras sea necesario. Con solo crear un montón de declaraciones preparadas y no cerrarlas, podría quedarse sin conexiones activas/permitidas y luego bloquear más comunicación con el servidor de base de datos.

Use una declaración preparada si desea ejecutar el mismo insert , update o select declaración con diferentes parámetros varias veces en una solicitud (HTTP). No utilice solicitudes preparadas para sobrevivir (HTTP).

En ciertas implementaciones de controladores y servidores de bases de datos, las declaraciones preparadas también pueden involucrar recursos asignados en el propio servidor de base de datos (no en la aplicación Go). Por ejemplo, una declaración preparada se puede compilar previamente en el servidor de base de datos y el servidor puede preparar un plan de ejecución de consultas, asignar ciertos recursos, como memoria, para ello. Estos pueden reservarse permanentemente hasta que se cierre la declaración preparada.

Hay un artículo (publicado por Myles McDonnell en los comentarios a continuación) que aborda los detalles de implementación de Declaraciones preparadas en Ir. Menciona que si las declaraciones preparadas no se crean a partir de transacciones, liberan la conexión al grupo de conexiones, pero cuando es necesario, intentan reutilizar lo mismo en el que se prepararon (porque si el servidor db ayuda / también juega un papel activo en la declaración preparada, está vinculado a la conexión en el lado del servidor). Si no, se re-prepararán en una nueva conexión (lo que provoca una sobrecarga de rendimiento no deseada).

En general, lo que describe es un modelo de trabajo, y si tiene una cantidad baja de declaraciones preparadas que se necesitan/ejecutan en muchas solicitudes posteriores, pueden significar tiempos de respuesta más cortos. Pero también significa que, por otro lado, a largo plazo, podrían resultar en que todas sus declaraciones preparadas se prepararán en todas las conexiones del grupo. Decide si esto es aceptable en tu caso.

En general, esto debe evitarse (y la declaración preparada debe cerrarse antes del final de la solicitud HTTP), pero si solo tiene algunos de ellos y los necesita en muchas solicitudes que se suceden, puede moverlos fuera del alcance de la solicitud. .