es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

EXPLICAR ACTUALIZACIÓN – ¿efectos secundarios o no sin ANALIZAR?

Es bien sabido que si ejecutas un EXPLAIN ANALYZE en una consulta, la consulta se ejecutará (aunque los resultados, suponiendo un SELECT, serán descartados). Por lo tanto, tiene mucho sentido que si ejecutas EXPLAIN ANALYZE en una instrucción UPDATE, la tabla en cuestión se actualizará.

Entiendo que se puede mitigar esto convirtiendo todo en una transacción (como se explica aquí en la documentación: https://www.postgresql.org/docs/9.1/sql-explain.html) o agregando 1=0 a la cláusula WHERE (lo último posiblemente cambiando el plan de consulta).

Sin embargo, esta declaración en la documentación es ambigua:

“Importante: Ten en cuenta que la declaración se ejecuta realmente cuando se utiliza la opción ANALYZE. Aunque EXPLAIN descartará cualquier resultado que devolvería un SELECT, los demás efectos secundarios de la declaración ocurrirán como de costumbre”.

¿Esto significa que si ejecutas EXPLAIN sin la palabra clave ANALYZE en una instrucción UPDATE, ocurrirán los efectos secundarios (es decir, la actualización)? ¿O solo ocurrirán si agregas ANALYZE a EXPLAIN? La primera frase de la cita sugiere lo último, pero la segunda frase sugiere lo primero (de ahí la ambigüedad). Sé que esta es una pregunta algo académica, pero igualmente me encantaría saber la respuesta.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La declaración en la documentación sugiere que si se ejecuta el comando EXPLAIN sin la palabra clave ANALYZE en una declaración UPDATE, los efectos secundarios (es decir, la actualización) no ocurrirán. Sin embargo, si se utiliza la opción ANALYZE, la consulta se ejecutará y la tabla se actualizará. Es importante tener en cuenta que aunque la salida de una declaración SELECT se descartará en ambos casos, otros efectos secundarios de la declaración aún pueden ocurrir. Se recomienda convertir toda la declaración en una transacción o agregar 1=0 a la cláusula WHERE para mitigar cualquier actualización no intencional.

Comments are closed.