Re: funcion plpgsql .... corrupcion de indice

From: Felipe de Jesús Molina Bravo <fjmolinabravo(at)gmail(dot)com>
To: "Emanuel Calvo Franco" <postgres(dot)arg(at)gmail(dot)com>
Cc: pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: funcion plpgsql .... corrupcion de indice
Date: 2008-12-11 17:28:53
Message-ID: c31298e50812110928h55170e3bgf717c85df5e2fec@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

El 11 de diciembre de 2008 10:48, Emanuel Calvo Franco <
postgres(dot)arg(at)gmail(dot)com> escribió:

> El día 11 de diciembre de 2008 14:18, Felipe de Jesús Molina Bravo
> <fjmolinabravo(at)gmail(dot)com> escribió:
> > Muchas gracias por el apoyo ... va mas detalle.
> >
> > La jerarquia esta implementada con una secuencia de farey. Este secuencia
> > utiliza un intervalo de numeros racionales (izquierdo y derecho). El
> numero
> > racional esta implementado como un tipo de dato en postgres (el codigo
> esta
> > en "C" y lo copie del manual de postgres). Tengo una tabla que tiene la
> > siguiente estructura (la tabla se llama pt_j_producto):
> >
> > - idproducto: integer (not null default
> > nextval('pt_j_producto_idproducto_seq'::regclass))
> > - izq: racional ( not null )
> > - der: racional (not null )
> > - padre:racional --este campo apunta al padre directo de un registro (lo
> > tengo para hacer algunas comprobaciones y para facilitar la inserción)
> > ..... otros campos....
> >
> > Los indices que tengo de esta tabla son:
> >
> > «pt_j_producto_pkey» PRIMARY KEY, btree (idproducto)
> > «pt_j_producto_farey» btree (izq, der)
> >
>
> por lo que estoy viendo estas utilizando btree. Para inserciones masivas...
> no
> te conviene utilizar hash?

no me acepta mi tipo de dato, el cual es "racional" ... muy probablemente le
falte mas programación

>
>
>
> > Tambien tiene un trigger al insertar que llena los atributos izq y der de
> la
> > tabla (el intervalo de farey)
> >
> > Para insertar tengo que proporcionar el padre(el cual ya debe existir en
> la
> > tabla) y el nuevo nodo. El codigo principal de la función es:
> >
> > FOR reg IN select j.izq,j.der
> > --obtiene toda una rama. izq_cat es la raiz
> de
> > una rama
> > from obt_rama( izq_cat, 'pt_j_producto'
> > ) as j,
> > --obtien el nivel del nodo del padre.
> tpadre
> > es el nodo padre.
> > --der_tpadre es el atributo "der" de tpadre
> > obt_nivel(tpadre, der_tpadre) nivel_tpadre
> > --filtra por todos los nodos que estan en el
> > mismo nivel
> > where nivel_tpadre = obt_nivel(j.izq, j.der)
> > LOOP
> > --codigo que hace algunas validaciones, por ejemplo que tengan la
> misma
> > ascencendencia,
> > etc....
> > ....
> > ....
> > --insertamos
> > insert into pt_j_producto( padre, .... )
> > values (reg.izq, .... );
> > returning izq into t_izq ;
> >
> > END LOOP;
> >
> > Llamo a mi función de la siguiente forma:
> >
> > aeevrm=# select insertar_cl_var_pt_jp ('(16, 17)'::racional, 13);
> >
> > e inicia la inserción ... pero de repente marca lo siguiente:
> >
> > NOTICE: 2262: variable (105813, 134521) -> izq : (166891, 212170)
> > ERROR: obt_izq-> El padre (426142, 541847) no existe en pt_j_producto
> > CONTEXT: PL/pgSQL function "inserta_farey" line 8 at assignment
> > sentencia SQL: «INSERT INTO pt_j_producto( padre, tiponodo, idvariable,
> > idvarclase,control) values ( $1 , '2' , $2 , $3 , '1' ) returning
> izq»
> > PL/pgSQL function "insertar_cl_var_pt_jp" line 74 at SQL statement
> >
>
> Por lo que veo existen trabajando dos funciones (una llamada por el trigger
> y otra es la que llamas)
> El 'padre' que no existe en el error... ya estaba insertado
> previamente a la ejecucion
> de la funcion? O es una tabla que ya tiene datos y estas agregando?

asi es ... ya estaba insertado.

>
>
> > Nota: El numero 2262 indica el numero de registro que se esta insertando.
> >
> > Este error lo despliega la funcion que se encarga de obtener el izq y der
> de
> > la tabla pt_j_producto, la cual se llama durante la inserción (trigger).
> Lo
> > que indica es que el nodo (426142, 541847) el cual es un padre no existe
> en
> > la relación pt_j_producto. Al buscar por este nodo obtengo:
> >
> > aeevrm=# select * from pt_j_producto where izq='(426142, 541847)';
> > idproducto | izq | der | padre | idvarclase | idclase | idvariable |
> > idvargeo | tiponodo | comportamiento | xml_reftemporal | control | html
> >
> ------------+-----+-----+-------+------------+---------+------------+----------+----------+----------------+-----------------+---------+------
> > (0 filas)
> >
> >
> > entonces hago un REINDEX a la tabla:
> >
> > aeevrm=# REINDEX TABLE pt_j_producto ;
> >
> > y vuelvo a ejecutar:
> >
> > aeevrm=# select * from pt_j_producto where izq='(426142, 541847)';
> > idproducto | izq | der | padre |
> > idvarclase | idclase | idvariable | idvargeo | tiponodo | comportamiento
> > | xml_reftemporal | control | html
> >
> ------------+------------------+------------------+-----------------+------------+---------+------------+----------+----------+----------------+-------------------------+---------+------
> > 52844 | (426142, 541847) | (328605, 417827) | (97537, 124020)
> > | | 517 | | | 4 |
> |
> > <rts id="37" comp="0"/> | 1 |
> > (1 fila)
> >
> > Es por eso que indico que se esta corrumpiendo el indice....o quizas sea
> > otro el problema ... alguna idea?
> >
> >
>
> clusterizaste los indices a las tablas?

dejame probarlo ....

>
>
> > gracias de antemano
> >
> >
> > PD. Disculpen por el top-posting pero imagine que sería mas claro de esta
> > forma
> >
> >
> >
> > El 11 de diciembre de 2008 7:11, Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org
> >
> > escribió:
> >>
> >> Felipe de Jesús Molina Bravo escribió:
> >>
> >> > Cuando el numero de registros insertados excede los 3300 marca un
> error
> >> > en
> >> > un indice que tengo y me corrompe mi índice
> >>
> >> ¿Cuál error? ¿Cómo sabes que el índice está corrupto?
> >
> >
> >
> >
> >
> >
> >>
> >> > ¿cuanto es el numero de registros que pueden ser insertados durante la
> >> > ejecución de una función en plpgsql o mas bién que parametro me
> permite
> >> > controlar lo anterior?
> >>
> >> No hay límite (salvo consideraciones como memoria disponible, pero no
> >> siempre aplican).
> >>
> >> --
> >> Alvaro Herrera
> >> http://www.flickr.com/photos/alvherre/
> >> "El sabio habla porque tiene algo que decir;
> >> el tonto, porque tiene que decir algo" (Platon).
> >
> >
>
>
>
> --
> Emanuel Calvo Franco
> Syscope Postgresql Consultant
> ArPUG / AOSUG Member
>

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Felipe de Jesús Molina Bravo 2008-12-11 17:38:30 Re: funcion plpgsql .... corrupcion de indice
Previous Message Javier Chávez B. 2008-12-11 17:16:55 Re: Select desde ASP