Re: Sobre la UNION en postgre!!!!

From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Rodolfo Vegas <vegasster(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Sobre la UNION en postgre!!!!
Date: 2009-05-20 22:12:58
Message-ID: 20090520221258.GL5368@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Rodolfo Vegas escribió:
> Hola de nuevo, como les habia dicho antes estaba implementando las
> operaciones conjuntistas difuzas de las cuales el INTERSECT y el EXCEPT
> estan ya hechas con éxito despues de tanto trabajo, ahora bien en la UNION
> es que me ha costado más y les voy a decir la razón: La UNION difuza se
> procede de la siguiente manera, tengo varios select's si eso select's son
> difuzos cada uno de ellos trae un grado de membresía que ya es calculado,
> ahora bien cuando se va a ejecutar la union, es la misma metodologia que la
> union booleana, los comunes y no comunes en las tuplas sin repetir, y por
> ejemplo si hay tuplas iguales se coloca la que tenga mayor grado de
> membresía.

Espero que hayas pensado bien cómo van a funcionar UNION ALL, EXCEPT
ALL, INTERSECT ALL ...
>
> y es en la línea 00425 que almacena dicha tupla en una estructura llamada
> HeapTuple, entonces que es lo que estaba pensando yo, que al momento de la
> ejecución de la UNION cuando encuentre que las tuplas que esta estudiando
> son iguales recorrer todo el HeapTuple como si fuese una matriz, donde las
> filas serían cada registro y las columnas el nombre de cada tupla tal cual
> como muestra postre el resultado por pantalla, no es optimo porque sería un
> recorrido secuencial y esa estructura de datos puede ser enorme por la
> cantidad de registros pero es la unica solución que veo, recorrer todo el
> HeapTuple y comparar con la tupla que se esta estudiando en la union para
> determinar cual es el que tiene mayor grado de membresía si el que esta
> dentro del HeapTuple o el que se esta procesando y asi lograr la
> modificación, ahora la pregunta es se puede hacer ese recorrido en el
> HeapTuple ó existe otra manera más facil y que consuma menos tiempo????????

No es fácil decir si dos tuplas son iguales. De partida, puede tocarte
un tipo de dato que no tenga operador de igualdad! Y segundo ¿ya
discutieron cómo va a funcionar con campos de punto flotante?

En cualquier caso, si quieres hacer algo simple puedes descomponer ambas
tuplas en sus datos constituyentes, para cada dato obtener el operador
de igualdad, y ejecutar el operador con los datos de cada registro.
Luego, si todas estas te retornan verdadero, puedes considerar las dos
tuplas como iguales. Para ver un ejemplo echale una mirada el código de
Replicator donde tuvimos que hacer algo relacionado:
https://projects.commandprompt.com/public/replicator/browser/trunk/src/backend/mammoth_r/collector/pgr.c#L1347

(Tienes suerte que se haya liberado el código de Replicator; recuerdo
que me tomó sus cuantas horas entender cómo escribir eso).

Ahora, hay otro camino más simple aún pero que no estoy seguro que te
vaya a servir: comparar las áreas de datos de las tuplas con memcmp().
Este código te puede servir de ejemplo

http://git.postgresql.org/gitweb?p=postgresql.git;a=blob;f=src/backend/utils/adt/trigfuncs.c;h=df9a7ffed3919a6fe512b8f5c376a2b59d004665;hb=11e3007feac7a53a63b69b4953b197a20d90143b

--
Alvaro Herrera Developer, http://www.PostgreSQL.org/
"El miedo atento y previsor es la madre de la seguridad" (E. Burke)

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Angelo Astorga 2009-05-20 22:53:11 Optimizacion correcta BD en postgresql !!!
Previous Message Luis A. Zevallos Cárdenas 2009-05-20 22:11:43 Re: Problemas con un check