¿Cómo enumerar todas las declaraciones preparadas para todas las sesiones activas?

Sé que hay una manera de enumerar todas las declaraciones preparadas para la sesión actual seleccionando todas las filas del pg_prepared_statements tabla, pero ¿hay alguna manera de ver todas las declaraciones preparadas para todas las sesiones activas? Creo que estoy buscando algo como una función de administrador, pero no puedo encontrar nada parecido en los documentos.

preguntado el 28 de agosto de 12 a las 13:08

1 Respuestas

No. AFAIK las declaraciones preparadas son locales para un backend; otros backends simplemente no saben que existen. Necesitaría modificar el servidor para agregar comunicación adicional entre procesos para permitir que un backend pregunte a los demás sobre las declaraciones preparadas.

Los backends inicialmente parecían compartir el mismo pg_prepared_statements almacenamiento de mesa, como:

SELECT relfilenode FROM pg_class WHERE  relname = 'pg_prepared_statements';

devuelve el mismo relfilenode desde diferentes backends. Me sorprendió, ya que pensé que las declaraciones preparadas no tenían presencia en el disco. Si estuvieran en el disco, supongo que podrías usar las funciones del módulo de contribución pageinspect para leer las tuplas sin procesar o las páginas de la tabla. La visibilidad sería un problema; ¿Cómo sabría qué estaba relacionado con un backend inactivo/terminado y qué era válido?

Intenté eso, y encontré que pg_prepared_statements es en realidad una vista:

regress=# SELECT * FROM heap_page_items(get_raw_page('pg_prepared_statements', 1));
ERROR:  cannot get raw page from view "pg_prepared_statements"

específicamente una vista sobre el pg_prepared_statement() función. Así que no hay nada que inspeccionar. Es backend interno.

Esto parece uno de esos "... pero ¿por qué harías eso?" preguntas, que a menudo es una señal de que alguien está preguntando sobre un solución han imaginado su problema real, en lugar de preguntar sobre su problema real.

Entonces: ¿Por qué quieres eso? ¿Cuál es el verdadero problema que estás tratando de resolver?

Respondido 28 ago 12, 14:08

Sí, tienes razón, estoy tratando de reducir un problema sobre el que no estoy muy seguro de resumirlo en forma de pregunta. Creo que puede tener algo que ver con las declaraciones preparadas en caché que devuelven filas con valores que han estado allí antes del último UPDATE. - Igor Zinov'yev

@IgorZinov'yev Es muy poco probable que las declaraciones preparadas estén relacionadas con sus consultas al ver datos antiguos. Las declaraciones preparadas no tienen caché de resultados ni caché de datos, solo una caché de planes. La única forma en que podría imaginar que eso sucediera sería si tú DROPped una partición en una estructura de herencia de tabla y los planes de las declaraciones preparadas no se vaciaron, pero Pg es muy cuidadoso con el seguimiento de dependencias para declaraciones preparadas para evitar ese tipo de cosas. - craig timbre

@IgorZinov'yev Probablemente necesite investigar el aislamiento de transacciones (¿está en READ COMMITED or SERIALIZABLE ¿aislamiento?), demarcación de transacciones (comience y finalice sus tx donde cree que lo hacen), etc. - craig timbre

Tiene razón, no estaba relacionado con las declaraciones preparadas de ninguna manera. Estaba relacionado con la ubicación incorrecta de la metaetiqueta, lo que provocó que la página del navegador se recargara, lo que provocó que se usaran datos almacenados en caché no válidos en la página. Me topé con el problema por accidente y decir que estoy sorprendido es no decir nada :) - Igor Zinov'yev

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.