Re: Ayuda Urgente

From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Vanessa Emperatriz Pacheco Rodriguez <ayudapostgresql(at)hotmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Ayuda Urgente
Date: 2006-07-04 00:12:31
Message-ID: 20060704001231.GB7971@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Vanessa Emperatriz Pacheco Rodriguez escribió:
>
> Buenas!! Quisiera saber si las Tablas Temporales son almacenadas en memoria
> o en disco...

Depende del taman~o y del uso del resto del servidor. Las tablas
temporales van a disco (sufren "write") pero no son sincronizadas
(fsync) como las tablas no temporales, y de hecho tampoco son
registradas en el WAL, asi que es bastante barato usarlas si es que son
suficientemente pequen~as para caber en el cache del sistema operativo.
Si son mas grandes que eso, no importa, porque se entiende que la
consulta sera bastante cara. Obviamente estoy asumiendo que te manejas
bastante bien con SQL y sabes perfectamente cuando _no_ necesitas usar
tablas temporales. (Si vienes de MySQL o estas recien aprendiendo SQL
lo mas probable es que la suposicion sea falsa).

Usalas con confianza. Las consultas muy grandes tambien se pueden ir a
disco, particularmente si usas grandes operaciones de Sort (se pueden
ver en el EXPLAIN). Tambien en nodos Materialize.

> Tambien quisiera saber si una función me puede retornar dos o mas tipos de
> datos diferentes, es decir, un cursor con un tipo de dato, o dos tipos de
> datos enteros, etc...

Si, puede, pero la consulta tiene que saberlo de antemano, es decir, no
puedes decidirlo al momento de ejecucion de la funcion. Por ej. tu
podrias dictaminar que la funcion retornara (int, text) en caso de
recibir un 1, o que retorne (int, int, text) en caso de recibir un 2.
Pero creo que esto seria infinitamente complicado de manejar, asi que te
sugiero mantenerte a distancia.

> Actualmente tengo una función que me retorna un tipo de dato, al hacer la
> llamada de la función utilizo un cursor y esto me resulta perfecto si
> invoco la función una sola vez. Pero que sucede cuando yo invoco a la
> función de nuevo y la incluyo en el cursor, este me sobreescribe los datos
> anteriores... y eso es lo que no quiero, yo deseo almacenar todos los datos
> que me traiga la funcion tantas veces yo haga la llamada y eso lo deseo en
> un unico cursor o en un unico lugar.

En tal caso lo que necesitas es una SRF, y usar RETURN NEXT para
retornar multiples resultados dentro de una sola invocacion a la
funcion.

Ojo, un cursor no contiene datos. Es solo una consulta que esta abierta
y cuya ejecucion es postergada. Lo que sucede al abrir el cursor por
segunda vez es que la primera se cierra, y por lo tanto no puedes seguir
obteniendo datos de ella. Pero conceptualmente no hay tal cosa como "se
sobreescriben los datos".

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

In response to

  • Ayuda Urgente at 2006-07-03 20:25:45 from Vanessa Emperatriz Pacheco Rodriguez

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2006-07-04 00:15:20 Re: Ayuda con Select Into
Previous Message Alvaro Herrera 2006-07-03 23:49:32 Re: RAISE NOTICE aparece dos veces