2012-01-22 15 views
5

Entiendo la diferencia principal entre el uso de Statement y PreparedStatement (PreparedStatements permite el paso de parámetros). Pero leí acerca de una sutil diferencia entre los dos, a saber, que PreparedStatements puede ser más rápido que los enunciados genéricos, porque PreparedStatement SQL está precompilado.Declaración frente a declaración preparada en términos de precompilación

¿Qué significa exactamente ser precompilado, y por qué marca la diferencia?

+0

buen detalle acerca de la pre-compilación: [http://stackoverflow.com/questions/5497297/what-does-pre-compiling-a-jdbc-preparedstatement-do][1] [1]: http: // stackoverflow.com/questions/5497297/what-do-pre-compiling-a-jdbc-preparedstatement-do – Awan

Respuesta

8

Una declaración preparada realiza las siguientes comprobaciones:

  • se asegura de que existen las tablas y columnas
  • se asegura de que los tipos de parámetros coinciden con sus columnas
  • analiza el SQL para asegurarse de que la sintaxis es correcta
  • Recopila y almacena en caché el SQL compilado para que pueda ser re-ejecutado sin repetir estos pasos
+2

Verificar la existencia de tablas y columnas, verificar la sintaxis, autenticar el acceso, preparar un plan de ejecución: el servidor db hace esto para cada declaración, preparado o no. Los servidores como Oracle también incluyen sentencias de caché (preparadas o no) basadas en un hash de la cadena de sentencias recibida. Una vez hecho este trabajo, y el servidor de db ha "preparado" un área de memoria como lista para comenzar, el controlador jdbc puede vincular parámetros y usar este objeto de servidor. Luego vuelva a vincular nuevos parámetros y vuelva a usarlos nuevamente sin tener que volver a preparar la declaración. Si el controlador lo implementa de esa manera. – Glenn

4

La parte más importante del proceso de compilación es la creación del plan de consulta.

El plan de consulta, como su nombre indica, indica cómo la base de datos debe ejecutar la consulta (por ejemplo, qué índices usar, los tipos de combinación a utilizar, como anidamiento-bucle/hash/fusión, etc.). Esto puede llevar tiempo ya que la base de datos necesita analizar la información en las tablas para adivinar qué es lo óptimo (por ejemplo, tamaños de tabla, índices disponibles, cuán específicos son los índices, etc.).

Si bien las declaraciones preparadas pueden ahorrar tiempo, debe tener cuidado ya que a veces pueden hacer que su programa sea más lento. ¿Por qué? Porque al no proporcionar los valores de la cláusula where como parte de la compilación, la base de datos tiene que adivinar los valores que va a proporcionar y puede elegir valores que conduzcan a un plan de consulta que no le resulte óptimo.

Esto puede ser más evidente para las consultas de rango. Por ejemplo, supongamos que crea una declaración preparada con fechas mínimas y máximas como parámetros. Esta consulta la usará para recuperar algunos días de transacciones. Dado el pequeño intervalo de fechas, esta consulta puede ser más eficiente de ejecutar si la base de datos utiliza la fecha del índice no agrupado.

Sin embargo, dado que la base de datos no sabe qué parámetros suministrará la base de datos puede optimizar para un rango de fechas mucho mayor (por ejemplo, un año o más), que puede ser más eficiente de ejecutar usando un escaneo de tabla. En este caso, usar la declaración preparada ralentizaría su programa (a menos que proporcione una pista a la base de datos sobre los parámetros para optimizar o explícitamente indique qué índices usar).

Por supuesto, si en la declaración preparada los parámetros que proporcionará apuntarán a registros individuales (por ejemplo, claves únicas en las tablas), la base de datos realmente no puede fallar al crear el plan de consulta.

Creo que estoy tratando de enfatizar que aquí hay pros y contras. Los estados preparados pueden ser más rápidos en algunas situaciones, pero debe tener cuidado.

Cuestiones relacionadas