Skip site navigation (1) Skip section navigation (2)

Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Re: [pgsql

From: Jose Luis Balle <joseluisballe(at)gmail(dot)com>
To:
Cc: Javier Chávez B(dot) <jchavezb(at)gmail(dot)com>, rperezm(at)uci(dot)cu, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Re: [pgsql
Date: 2009-10-28 13:36:02
Message-ID: 6d87542d0910280636o3e6eae48g657101604f3a26a5@mail.gmail.com (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
Lo Prometido.
La tabla:
CREATE TABLE items
(
  id serial NOT NULL,
  padre bigint NOT NULL,
  nombre character varying(300) NOT NULL,
  descripcion text,
  CONSTRAINT items_pkey PRIMARY KEY (id)
)
WITH (OIDS=TRUE);

La función, en realidad como recursiva, tantas veces como sea
necesario hasta llegar a la última hoja -1  que es la hoja en sí, el
registro.
CREATE OR REPLACE FUNCTION getancestor(este character varying, item integer)
  RETURNS character varying AS
$BODY$
DECLARE
retorno integer;
BEGIN
SELECT padre INTO retorno FROM items WHERE id=item;
IF  NOT FOUND OR retorno=0 THEN
	return este;
ELSE
	return getancestor(retorno::varchar||'.'||este,retorno);
END IF;
END;
$BODY$
  LANGUAGE 'plpgsql' STABLE
  COST 100;
ALTER FUNCTION getancestor(character varying, integer) OWNER TO user;

Y no anda tan mal, 391ms sobre 1678 filas, lo que en realidad me toma
mucho tiempo es una vista que me sumariza cada hoja del árbol
Seq Scan on items  (cost=0.00..480.28 rows=1678 width=159)

En fin, no se si es lo mejor pero por ahora me sirve.
Voy a investigar tu recomendación Alvaro, gracias.
Saludos

El día 27 de octubre de 2009 23:00, Alvaro Herrera
<alvherre(at)alvh(dot)no-ip(dot)org> escribió:
> Jose Luis Balle escribió:
>> Yo tengo implementado una especie de rubro sub-rubro de la misma
>> forma, pero a la hora de retornar el codigo 1.1.2.4 hice una función
>> de agregación pero me toma mucho tiempo. Está bien que el fierro no
>> acompaña pero sobre 4000 registros demora su tiempo.
>> Mañana subo la función y te paso bien los tiempos.
>> De todas formas no conozco otra forma de implementar jerarquía en
>> bases de datos relacional
>
> El problema es que tienes que recorrer la tabla cuatro veces para
> encontrar la descripción.  Puedes usar ltree para hacerlo más rápido.
> Es un módulo contrib, usa índices GiST si mal no recuerdo.
>
> En Postgres 8.4 una de las novedades es la funcionalidad WITH RECURSIVE
> que permite responder en una sola consulta esta clase de cosas, mucho
> más simple y seguramente más rápido que cualquier otra forma de hacerlo.
>
> --
> Alvaro Herrera       Vendo parcela en Valdivia:  http://rie.cl/?a=255568
> "El sabio habla porque tiene algo que decir;
> el tonto, porque tiene que decir algo" (Platon).
>



-- 
“Frecuentemente me preguntan en las conferencias: ¿por qué deberíamos
creerles a ustedes los escépticos? Mi respuesta es: no deberían
creernos. No deberían creer a nadie basándose en la autoridad o
posición que esta persona tenga. ”
Michael Shermer

In response to

Responses

pgsql-es-ayuda by date

Next:From: José SenaDate: 2009-10-28 13:53:48
Subject: Problemas con cifras o redondeno
Previous:From: susoDate: 2009-10-28 13:21:54
Subject: Re: otra de auditoría

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group