Tengo una enorme base de datos de alrededor de 800 GB. Cuando he intentado ejecutar una consulta que grupos de ciertas variables y agregados al resultado, fue a parar después de correr durante un par de horas. Postgres estaba lanzando un mensaje de que el espacio en disco está lleno. Después de mirar las estadísticas me di cuenta de que la base de datos tiene cerca de 400 GB de archivos temporales. Yo creo que estos archivos temporales donde se crea mientras se estaba ejecutando el query. Mi pregunta es ¿cómo puedo eliminar estos archivos temporales. También, ¿cómo puedo evitar tales problemas de uso de los cursores o para bucles para no procesar todos los datos a la vez? Gracias.

Estoy usando Postgres 9.2

  • ¿Cómo se puede «mirar las estadísticas» y lo «archivos temporales» está usted hablando? Las tablas temporales se eliminan al final de una sesión, para cerrar su sesión y, a continuación, la apertura de una nueva sesión debe hacer el truco.
  • Lo anterior debería ser, posiblemente, se trasladó a la respuesta.
  • La causa más probable es un (no deseados) Carthesian producto.

2 Comentarios

  1. 5

    Los archivos temporales que se crean en el base/pgsql_tmp durante la ejecución de la consulta se borran cuando se realice la consulta. No debe eliminar a mano.

    Estos archivos tienen nada que ver con las tablas temporales, que se utiliza para almacenar los datos de hash grandes o tipo de operaciones que no cabrían en work_mem.

    Asegurarse de que la consulta se ha terminado o cancelado, intente ejecutar CHECKPOINT dos veces en una fila y ver si los archivos están todavía allí. Si sí, eso es un error; hizo el servidor PostgreSQL accidente cuando se haya agotado el espacio en disco?

    Si realmente tienes los archivos antiguos en base/pgsql_tmp que no se eliminan automáticamente, creo que es seguro eliminar manualmente. Pero me gustaría presentar un error con PostgreSQL en ese caso.

    No hay manera de evitar grandes archivos temporales si su plan de ejecución necesidades para ordenar conjuntos de resultados grandes o necesidades para crear grandes hashes. Los cursores no te podrá ayudar. Supongo que con para bucles de que significa pasar de procesamiento de la base de datos el código de la aplicación – haciendo que generalmente es un error y sólo mover el problema de la base de datos a otro lugar donde el procesamiento es menos eficiente.

    Cambiar la consulta, por lo que no tiene que ordenar o hash de grandes conjuntos de resultados (marque con EXPLAIN). Sé que no parece muy útil, pero no hay mejor manera. Usted probablemente tendrá que hacerlo de todos modos, o es un tiempo de ejecución de varias horas aceptable para usted?

    • Gracias. Estoy usando algunos de encargo de las funciones de agregado, que creo que es la creación de grandes archivos temporales. El EXPLICAR muestra que la función de agregado es la ordenación de los datos. Me pregunto si hay una manera de evitar el tipo de funciones de agregado. Yo no estoy interesado en el orden de los resultados. Tiempo de ejecución de varias horas es aceptable, porque este es un tiempo de procesamiento de datos, pero los archivos temporales muy grandes y se detiene la ejecución de la consulta. Gracias.
    • Con personalizar las funciones de agregado te refieres a terceros las funciones de C? Es difícil responder a esa pregunta sin saber que función de agregado se define y lo que el EXPLAIN salida parece.

Dejar respuesta

Please enter your comment!
Please enter your name here