RE: Cache de funciones

From: "Alberto Pia" <alberto(dot)pina(at)kebir(dot)com(dot)mx>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Cc: "'Jaime Casanova'" <systemguards(at)gmail(dot)com>
Subject: RE: Cache de funciones
Date: 2005-04-15 01:05:35
Message-ID: 20050415010535.5441B53A44@svr1.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda


Gracias Jaime y Alvaro. Declare mi funcion como STABLE y reduje el tiempo
de respuesta de una manera impresionante.
Leí en la documentación que la diferencia entre INMUTABLE y STABLE es que la
stable depende de una busqueda sobre la base de datos y la otra no.
Mi caso es el siguiente: Tengo una funcion que de acuerdo al valor de un
campo en una tabla, debe de obtener el valor de otro campo en otra tabla.
Lo que hace que la funcion se tarde si es VOLATILE es que la relación (o
relaciones) que existen para encontrar el valor buscado a traves del valor
dado son varias.
Al dejar la funcion (que por default es VOLATILE) de ese modo se tardaba
horrores. La declare STABLE y todo funciono perfectamente bien. Mi
pregunta es aun declarandola STABLE si el valor o mas bien el resultado de
la función llegará a cambiar, de todos modos me regresa el valor que estoy
buscando?
Espero haberme explicado bien (puesto que leí el famoso documento que
enviaron para hacer preguntas inteligentes).
Saludos

> Al llamar a la misma funcion con los mismos parametros puedes estar
> absolutamente seguro que *siempre* regresara los mismo valores? en ese
> caso declarala IMMUTABLE
>
> Lo que hace es que si la declaras IMMUTABLE reemplaza sucesivas
> llamadas a la funcion con el resultado de la primera llamada.

No necesariamente reemplaza. _Puede_ reemplazar (es decir: el optimizador
tiene derecho a reescribir la consulta de manera que en lugar de invocarse
la funcion dos o mas veces, se invoque una sola vez.
El optimizador no esta "obligado" a hacer una tal transformacion).

> Al llamar a la misma funcion con los mismos parametros puedes estar
> absolutamente seguro que dentro de la misma transaccion *siempre*
> regresara los mismo valores? en ese caso declarala STABLE
>
> STABLE reemplaza sucesivas llamadas a la funcion dentro de la misma
> transaccion con el resultado de la primera llamada en esa transaccion.

No dentro de la misma transaccion. Es solo "dentro de un mismo snapshot", o
equivalentemente, dentro de un scan. O lo que es lo mismo, dentro de una
transaccion que tiene ISOLATION LEVEL SERIALIZABLE.

Atentamente
Ing. Carlos Alberto Piña Uribe
Consultoría y Desarrollo
KEBIR Infraestructura Tecnológica

alberto(dot)pina(at)kebir(dot)com(dot)mx
Cel. 044-55-59-64-85-07
Tel. 55-30-22-37
Fax 55-38-88-49

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message David Prieto 2005-04-15 06:41:38 RE:
Previous Message Fernando Aguada 2005-04-14 21:52:33 Re: Como Puedo llamar a una funcion estando dentro de otra funcion