Estoy tratando de conseguir la caída de la utilización de tablas temporales:

CREATE OR REPLACE FUNCTION test1(user_id BIGINT) RETURNS BIGINT AS
$BODY$

BEGIN
  create temp table temp_table1
  ON COMMIT DELETE ROWS

  as SELECT table1.column1, table1.column2 
  FROM table1
  INNER JOIN -- ............

  if exists (select * from temp_table1) then
    -- work with the result
    return 777;
  else 
    return 0;
  end if;

END;
$BODY$
LANGUAGE plpgsql;

Quiero la fila temp_table1 ser eliminado inmediatamente o tan pronto como sea posible, por eso he añadido ON COMMIT DELETE ROWS. Obviamente, yo tengo el error:

ERROR:  relation "temp_table1" already exists

He intentado añadir IF NOT EXISTS pero no podía, simplemente no podía encontrar trabajo de ejemplo de lo que sería la estoy buscando.

Sus sugerencias?

InformationsquelleAutor | 2014-04-08

3 Comentarios

  1. 11

    DROP Table cada vez antes de crear la tabla temporal de la siguiente manera:

    BEGIN
      DROP TABLE IF EXISTS temp_table1;
      create temp table temp_table1
      -- Your rest Code comes here
    • se tiene el convencimiento de que es más eficaz que ELIMINAR FILAS?
    • Sí, porque sólo eliminar filas no va a caer de la Tabla y que la forma no se puede crear esta mesa de nuevo.
    • pero no necesito. Estoy preguntando sobre en términos de rendimiento también.
    • Yo estaba bajo la impresión de que esta es una mala práctica que tendría a mantener ambas tablas en la memoria (como alternativa derrame en el disco si el tamaño lo requiere), ¿es correcto esto? También, incluso si temp_table1 no existe en el punto de CAÍDA sería aún causar la hinchazón debido a los bloqueos de derecho?
  2. 2

    Desea COLOCAR plazo de la tabla después de cometer (no ELIMINAR FILAS), así:

    begin
      create temp table temp_table1
      on commit drop
    ...

    Documentación

    • se tiene el convencimiento de que es más eficaz que ELIMINAR FILAS?
    • Estoy seguro de que es más efectivo que «en cometer eliminar filas’ + ‘drop table if exists’.
    • pero en realidad no necesito a caer como puedo eliminar filas. Por qué iba yo a volverlo a crear cada vez en lugar de simplemente eliminar de sus filas?
    • Por desgracia, la construcción create temp table if not exists ... as ... no está permitido en postgres (postgresql.org/docs/9.2/static/sql-createtableas.html). Como una cuestión de eficiencia seguro que no es un problema crucial.
  3. 0

    El problema de las tablas temporales es que al quitar y volver a crear la tabla temporal hincha pg_attribute fuertemente y, por tanto, una mañana soleada encontrará db rendimiento de los muertos, y pg_attribute de 200 gb, mientras que su db sería como 10gb.

    Por lo tanto, estamos muy pesado en las tablas temporales tener >500 rps y asincrónica i\o a través de nodejs y así experimentado una fuerte distensión de pg_attribute debido a que. Todo lo que queda es un muy agresivo pasar la aspiradora que detiene el rendimiento.
    Todas las respuestas que se dan aquí no resolver esto, porque todos ellos hinchazón pg_attribute fuertemente.

    Así que la solución es elegante este

    create temp table if not exists my_temp_table (description) on commit delete rows;

    Así que ir jugando con las tablas temporales y guardar su pg_attribute.

Dejar respuesta

Please enter your comment!
Please enter your name here