Re: funcion plpgsql .... corrupcion de indice

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

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?

> 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?

> 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?

> 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

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2008-12-11 16:51:34 Re: funcion plpgsql .... corrupcion de indice
Previous Message Felipe de Jesús Molina Bravo 2008-12-11 16:18:17 Re: funcion plpgsql .... corrupcion de indice