Discussion:
Como convertir los SELECT que usan AS en otros manejadores a Postrgres
Orlando Ramirez
2007-05-10 20:27:55 UTC
Permalink
Estoy migrando una base de datos de Sybase a Postgres y en muchos de los SELECT se usan la sentencia AS. Para ilustrarlo supongamos que tenemos una tabla cuyas columnas son column_id y column_description. Sus filas son:

column_id column_description
1111------------------description 1
111101---------------description 2
11110101------------description 3
1121------------------description 4
112101---------------description 5
11210101------------description 6
1131------------------description 7
113101---------------description 8
11310101------------description 9

Necesito mostrar (en filas no-repetidas) los 4 primeros caracteres del identificador de columna (column_id) y su respectiva descripcion (column_description) de las filas de esta tabla que cumplen una determinada condicion.

En Sybase (usando subsconsultas) la sentencia tiene esta forma:

SELECT distinct(substring(column_id,1,4)) AS columna, (select column_description from tabla where column_id=columna) from tabla
WHERE <condicion>

Pero en Postgres cuando se hace esto el identificador columna definido con AS no es reconocido en la subconsulta (¿?).

¿Como hacerlo de una manera eficiente (sin tener que usar otra subconsulta)?

Agradezco de antemano las sugerencias.

Orlando Ramirez
http-peru


---------------------------------
Ahhh...imagining that irresistible "new car" smell?
Check outnew cars at Yahoo! Autos.
Roberto Tortolero
2007-05-10 20:58:59 UTC
Permalink
Buenas, ya pude levantar los dos servicios postgresql en nuestro servidor,
los dos se ejecutan y no hay conflictos entre ellos (que yo sepa), el
detalle es que cuando se trata de accesar la version 8.2.4 del postgresql a
traves del Sql Manager de EMS dice que no hay conexion o que ese host no
existe.

Las dos versiones estan corriendo en puertos diferentes, y con el puerto
5432 (el predeterminado de postgresql) si hay acceso a traves del sql
manager, con la version 8.0.4, pero por el otro puerto no tiene acceso, que
es el que tiene la version nueva 8.2.4.

Si me pudieran iluminar con una buena sugerencia, mucho lo agradeceria.

Gracias de antemano.
Gabriel Hermes Colina Zambra
2007-05-10 21:21:24 UTC
Permalink
Post by Roberto Tortolero
Las dos versiones estan corriendo en puertos
diferentes, y con el puerto
5432 (el predeterminado de postgresql) si hay acceso
a traves del sql
manager, con la version 8.0.4, pero por el otro
puerto no tiene acceso, que
es el que tiene la version nueva 8.2.4.
Si me pudieran iluminar con una buena sugerencia,
mucho lo agradeceria.
Gracias de antemano.
Te sugiero ver el pg_hba.conf del que no se conecta,
sabiendo que eso esta bien, cuando te registres
localhost o mediante la ip con el EMS, fijate que uno
de los parametros de registros es el puerto, pero aqui
hay una pequenia cosita a tener encuenta.

Firewall, en las excepciones uno crea una con el
nombre por ejemplo psql y le dice que acepte 5432,
fuiste ahi y abriste otra excepcion para el nuevo
puerto donde escuchas ? por que si no ni modo.

Espero que te sirva estas cuestiones, manteneme al
tanto del resultado por favor.

Atte.
Gabriel Hermes Colina Zambra.

__________________________________________________
Correo Yahoo!
Espacio para todos tus mensajes, antivirus y antispam ¡gratis!
Regístrate ya - http://correo.espanol.yahoo.com/
Roberto Tortolero
2007-05-10 21:40:23 UTC
Permalink
Si, ya creamos la excepcion en el firewall, el detalle es que a nivel de
localhost no me puedo conectar ya que el servidor es linux y esta en otra
locacion.

Me conecto por el EMS y claro, seteo el puerto para que lo localice por ese
puerto, la cuestion me la hace solo para el puerto 5432 pero no para el
nuevo puerto.

Pensamos que pueda ser un problema con el linux, que no creamos bien al
ususario nuevo para que se encargue de la cuenta del postgresql 8.2.4, ahora
vamos a recompilar y hacer todo otra vez a ver que pueda pasar.

Si tiene otra sugerencia, mucho lo apreciaria.

Gracias de antemano.
Roberto Tortolero
2007-05-10 21:49:35 UTC
Permalink
Este es otro pequeño detalle...

Cuando ejecutamos el comando ps -ef para mostrar los procesos y sus usuarios
en linux, aparece que postgres (que es el usuario de la version 8.0.4) tiene
privilegios sobre la version nueva del postgres 8.2.4.

Nosotros creamos una cuenta para ese nuevo postgres 8.2.4 pero no aparece
cuando ejecutamos el ps -ef, solo aparece ese usuario viejo postgres.




Gracias.
Jaime Casanova
2007-05-11 03:54:47 UTC
Permalink
Post by Roberto Tortolero
Buenas, ya pude levantar los dos servicios postgresql en nuestro servidor,
los dos se ejecutan y no hay conflictos entre ellos (que yo sepa), el
detalle es que cuando se trata de accesar la version 8.2.4 del postgresql a
traves del Sql Manager de EMS dice que no hay conexion o que ese host no
existe.
que tiene esto que ver con el tema del thread?
mira, por favor, lo que causas en el archivo de la lista (dale a follow-ups):
http://archives.postgresql.org/pgsql-es-ayuda/2007-05/msg00280.php

o desde afuera verias esto
http://archives.postgresql.org/pgsql-es-ayuda/2007-05/threads.php#00280
--
Atentamente,
Jaime Casanova

"Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs and the universe trying
to produce bigger and better idiots.
So far, the universe is winning."
Richard Cook
Gabriel Hermes Colina Zambra
2007-05-11 04:22:36 UTC
Permalink
Post by Jaime Casanova
que tiene esto que ver con el tema del thread?
mira, por favor, lo que causas en el archivo de la
http://archives.postgresql.org/pgsql-es-ayuda/2007-05/msg00280.php
Post by Jaime Casanova
o desde afuera verias esto
http://archives.postgresql.org/pgsql-es-ayuda/2007-05/threads.php#00280
Post by Jaime Casanova
--
Atentamente,
Jaime Casanova
"Programming today is a race between software
engineers striving to
build bigger and better idiot-proof programs and the
universe trying
to produce bigger and better idiots.
So far, the universe is winning."
Richard Cook
---------------------------(fin del
mensaje)---------------------------
TIP 4: No hagas 'kill -9' a postmaster
Sabes que es la primera vez que me pongo a pensar en
eso Jaime, en el efecto en el archivo de la lista,
justo antes de leer tu e-mail, pensaba que estaba
contestando a algo que se habia salido del asunto
original, algo como esto que termino en el uso de gui.

Como hacemos para contestar algo que hay en un thread
pero deveria generar otro, por cambiar de topico.

Creamos otro thread mencionando cual origina la
respuesta.? o como ?

Atte
Gabriel Hermes Colina Zambra

__________________________________________________
Correo Yahoo!
Espacio para todos tus mensajes, antivirus y antispam ¡gratis!
Regístrate ya - http://correo.espanol.yahoo.com/
Jaime Casanova
2007-05-11 05:17:35 UTC
Permalink
Post by Orlando Ramirez
SELECT distinct(substring(column_id,1,4)) AS columna, (select
column_description from tabla where column_id=columna) from tabla
WHERE <condicion>
Pero en Postgres cuando se hace esto el identificador columna definido con
AS no es reconocido en la subconsulta (¿?).
que tal algo como:

select column_id, column_description
from (select substring(column_id from 1 for 4) as codigo
from tabla group by 1) as foo, ctbt010
where column_id = codigo ;
--
Atentamente,
Jaime Casanova

"Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs and the universe trying
to produce bigger and better idiots.
So far, the universe is winning."
Richard Cook
Alvaro Herrera
2007-05-11 13:52:55 UTC
Permalink
Post by Orlando Ramirez
Estoy migrando una base de datos de Sybase a Postgres y en muchos de
los SELECT se usan la sentencia AS. Para ilustrarlo supongamos que
tenemos una tabla cuyas columnas son column_id y column_description.
column_id column_description
1111------------------description 1
111101---------------description 2
11110101------------description 3
1121------------------description 4
112101---------------description 5
11210101------------description 6
1131------------------description 7
113101---------------description 8
11310101------------description 9
(Que modelo tan horrible)
Post by Orlando Ramirez
Necesito mostrar (en filas no-repetidas) los 4 primeros caracteres del
identificador de columna (column_id) y su respectiva descripcion
(column_description) de las filas de esta tabla que cumplen una
determinada condicion.
No entendi la descripcion ... puedes dar un ejemplo concreto? La
condicion y el resultado.
Post by Orlando Ramirez
Pero en Postgres cuando se hace esto el identificador columna definido
con AS no es reconocido en la subconsulta (¿?).
Eso es correcto, porque una subconsulta en la lista de resultados no
tiene acceso a las columnas de la consulta exterior. (Me parece que lo
que desearias seria poner la subconsulta en el WHERE como una consulta
correlacionada, o quizas en el FROM).
--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
Orlando Ramirez
2007-05-12 07:31:36 UTC
Permalink
Estoy migrando una base de datos de Sybase a Postgres y en muchos de los SELECT de sus procedientos almacenados se usa la declaracion AS.

Agradezco a Jaime Casanova por diligente su comentario, aunque no alcanzo a comprender la solución que propone, y a Alvaro Herrera por el suyo en donde lo mas saltante es su ironica frase: Que modelo tan horrible. Lo que no comprende Alvaro es que existen estructuras de datos en donde el usuario lo tiene definido de esa manera y se vienen usando asi por siglos. En este caso concreto, esta es una tabla que contiene un plan de cuentas contable.

Voy a tratar ilustrar un caso. Supongamos que tenemos un tabla llamada CUENTAS que posee tres columnas: el codigo de cuenta cod_cta (varchar 20), la descripcion de la cuenta des_cta (varchar 100) y el saldo de la cuenta mto_sld (numeric (12,2)).

Algunas de las filas de esta tabla son:

1111---------------------------- CAJA ------------------------------------- 100,000.00
111101------------------------ OFICINA PRINCIPAL --------------- 60,000.00
11110101-------------------- BILLETES Y MONEDAS --------- 60,000.00
1111010100000001---- CAJERO1 ------------------------------- 40,000.00
1111010100000002---- CAJERO2 ------------------------------- 20,000.00
111102------------------------ AGENCIA ZONA FRANCA ------ 40,000.00
11110201-------------------- BILLETES Y MONEDAS -------- 40,000.00
1111020100000001---- CAJERO1 ------------------------------- 30,000.00
1111020100000002---- CAJERO2 ------------------------------- 10,000.00
1211---------------------------- FONDOS INTERBANCARIOS--- 80,000.00
121104------------------------ CAJAS MUNICIPALES------------- 80,000.00
12110406000001-------- CAJA TRUJILLO---------------------- 45,000.00
12110406000002-------- CAJA AREQUIPA--------------------- 35,000.00

Se desea reportar los saldos de las cuentas contables a 8 digitos:

11110101------------------- BILLETES Y MONEDAS --------- 60,000.00
11110201------------------- BILLETES Y MONEDAS --------- 40,000.00
12110406------------------ < desconocido > ------------------------80,000.00

En Sybase (usando subsconsultas) la sentencia SELECT tiene esta forma (no es el query exacto):

SELECT distinct(substring(cod_cta,1,8)) AS codigo,
(select des_cta from CUENTAS where cod_cta=codigo),
(select sum(mto_sld) from CUENTAS where cod_cta=codigo)
FROM CUENTAS
WHERE length(cod_cta)>=8

Como bien lo corrobora Alvaro, en Postgres cuando se hace esto el identificador codigo definido con AS no es reconocido en la subconsultas.

¿Como hacer esto de una manera eficiente sin usar la declaracion AS?

Atte.

Orlando Ramirez
CEO http-peru


---------------------------------
Food fight? Enjoy some healthy debate
in the Yahoo! Answers Food & Drink Q&A.
Gabriel Hermes Colina Zambra
2007-05-12 14:37:12 UTC
Permalink
Post by Orlando Ramirez
Estoy migrando una base de datos de Sybase a
Postgres y en muchos de los SELECT de sus
procedientos almacenados se usa la declaracion AS.
Agradezco a Jaime Casanova por diligente su
comentario, aunque no alcanzo a comprender la
solución que propone, y a Alvaro Herrera por el suyo
en donde lo mas saltante es su ironica frase: Que
modelo tan horrible. Lo que no comprende Alvaro es
que existen estructuras de datos en donde el usuario
lo tiene definido de esa manera y se vienen usando
asi por siglos.
Pues disculpame, me senti tocado un poquito con esta
ultima frase.

Alvaro te hace un comentario, creo que valido, no
merece que pienses que no comprende, pero apostaba a
la capacidad tuya para replanterate el asunto,
plantearle a tu cliente un cambio en el modelo y en el
desarrollo para armar algo mas prolijo.

Te propongo que tu trates de entender mas sobre el
aporte que te estan dando Jaime y Alvaro.

Y pido disculpas tambien por esta contestacion a
quienes les molesta esto en la lista, pero bueno asi
como ataco a quien teniendo experiencia trata mal a
alguien que no sabe como comportarse en la lista,
tambien veo mal que a alguien que se le aporto una
solucion y no la ve, salga a acusar con el indice a
quien trato de una u otra forma colaborar con el.

Sepan que mi intencion con esto es reflexionar y no
para polemizar.

Atte.
Gabriel Hermes Colina Zambra

__________________________________________________
Correo Yahoo!
Espacio para todos tus mensajes, antivirus y antispam ¡gratis!
Regístrate ya - http://correo.espanol.yahoo.com/
Orlando Ramirez
2007-05-12 15:54:12 UTC
Permalink
No es mi intención polemizar, pero considero que no se deberian hacer juicios de valor para no herir susceptibilidades entre los miembros de una lista eminentemente tecnica como esta.

Por supuesto que estoy agradecido a Jaime y a Alvaro por sus comentarios.

Saludos
Post by Orlando Ramirez
Estoy migrando una base de datos de Sybase a
Postgres y en muchos de los SELECT de sus
procedientos almacenados se usa la declaracion AS.
Agradezco a Jaime Casanova por diligente su
comentario, aunque no alcanzo a comprender la
solución que propone, y a Alvaro Herrera por el suyo
en donde lo mas saltante es su ironica frase: Que
modelo tan horrible. Lo que no comprende Alvaro es
que existen estructuras de datos en donde el usuario
lo tiene definido de esa manera y se vienen usando
asi por siglos.
Pues disculpame, me senti tocado un poquito con esta
ultima frase.

Alvaro te hace un comentario, creo que valido, no
merece que pienses que no comprende, pero apostaba a
la capacidad tuya para replanterate el asunto,
plantearle a tu cliente un cambio en el modelo y en el
desarrollo para armar algo mas prolijo.

Te propongo que tu trates de entender mas sobre el
aporte que te estan dando Jaime y Alvaro.

Y pido disculpas tambien por esta contestacion a
quienes les molesta esto en la lista, pero bueno asi
como ataco a quien teniendo experiencia trata mal a
alguien que no sabe como comportarse en la lista,
tambien veo mal que a alguien que se le aporto una
solucion y no la ve, salga a acusar con el indice a
quien trato de una u otra forma colaborar con el.

Sepan que mi intencion con esto es reflexionar y no
para polemizar.

Atte.
Gabriel Hermes Colina Zambra

__________________________________________________
Correo Yahoo!
Espacio para todos tus mensajes, antivirus y antispam ¡gratis!
Regístrate ya - http://correo.espanol.yahoo.com/


---------------------------(fin del mensaje)---------------------------
TIP 9: el optimizador ignorará el uso de recorridos de índice si los
tipos de datos de las columnas no coinciden



---------------------------------
Yahoo! oneSearch: Finally, mobile search that gives answers, not web links.
Gabriel Hermes Colina Zambra
2007-05-12 16:45:27 UTC
Permalink
Post by Orlando Ramirez
No es mi intención polemizar, pero considero que no
se deberian hacer juicios de valor para no herir
susceptibilidades entre los miembros de una lista
eminentemente tecnica como esta.
Por supuesto que estoy agradecido a Jaime y a
Alvaro por sus comentarios.
Saludos
Ok, soy el menos indicado, aparentemente, para
aconsejar que no tengamos suceptibilidades, pero es
cierto, y es esta reflexion sana tuya a la que me
referia, yo voy a tratar de hacer algo positivo y leer
sobre tu problema a ver que puedo aportarte.

Saludos

__________________________________________________
Correo Yahoo!
Espacio para todos tus mensajes, antivirus y antispam ¡gratis!
Regístrate ya - http://correo.espanol.yahoo.com/
Mario Wojcik
2007-05-12 23:18:39 UTC
Permalink
Hola Gente
Estoy instalando linux para ser servidor de bases de datos, y me
encuentro con el tema del sistema de archivos a usar.
De que forma almacena los datos postgrtes?
Lo hace en archivos de gran tamaño? (en este caso usaria XFS), o lo hace
en archivos mas o menos pequeños, como paginas de la base? (usaria
reiserfs)...
Muchas gracias por sus comentarios.
Alvaro Herrera
2007-05-13 00:31:40 UTC
Permalink
Post by Mario Wojcik
Hola Gente
Estoy instalando linux para ser servidor de bases de datos, y me
encuentro con el tema del sistema de archivos a usar.
De que forma almacena los datos postgrtes?
Lo hace en archivos de gran tamaño? (en este caso usaria XFS), o lo hace
en archivos mas o menos pequeños, como paginas de la base? (usaria
reiserfs)...
Las tablas se almacenan en archivos, divididas en segmentos de 1 GB.

Me atrevo a decir que la gente que ha hecho comparaciones de los
distintos sistemas de archivos (con respecto a Pg) no ha llegado a
conclusiones que indiquen una o la otra. Probablemente lo mejor es
quedarse con la mas estable. Hay otros factores que son mucho mas
importantes para el rendimiento.
--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.
Mario Wojcik
2007-05-13 01:08:58 UTC
Permalink
Post by Alvaro Herrera
Las tablas se almacenan en archivos, divididas en segmentos de 1 GB.
Me atrevo a decir que la gente que ha hecho comparaciones de los
distintos sistemas de archivos (con respecto a Pg) no ha llegado a
conclusiones que indiquen una o la otra. Probablemente lo mejor es
quedarse con la mas estable. Hay otros factores que son mucho mas
importantes para el rendimiento.
Gracias Alvaro.
Por supuesto, hay otros factores importantes, pero como estoy comenzando
de 0 la instalacion, aprovecho para buscar la mejor opcion en este
aspecto también. Yo siempre usé reisefs pero estoy tentado ahora con
XFS, mas si los archivos llegan a 1gb.
A todo esto, cual sistema de archivos consideras que es la mejor opcion?
O cual es el que usas generalmente?
Alvaro Herrera
2007-05-13 01:51:47 UTC
Permalink
Post by Mario Wojcik
A todo esto, cual sistema de archivos consideras que es la mejor opcion?
O cual es el que usas generalmente?
ext3

Alguna vez fui fanático de ReiserFS, pero hace dos días destruí la única
partición que me quedaba (un /home que se fue en un PC que vendí) y
nunca lo he echado de menos. Lo único que ext3 no tiene es lo de "tail
packing", pero no es un tema que me quite el sueño.

También usé XFS, pero a decir verdad nunca hice ninguna prueba ni
comparación.
--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
eduardo arenas
2007-05-15 19:48:36 UTC
Permalink
---------- Forwarded message ----------
From: eduardo arenas <pgmanlist-***@public.gmane.org>
Date: 15-may-2007 15:48
Subject: Re: [pgsql-es-ayuda] Como utiliza el espacio en disco postgresql?
To: Alvaro Herrera <alvherre-UrU3iCXxUysMNcg9MzyYcQC/***@public.gmane.org>

Estimado, los expertos en DB señalan que ext2 es 7 veces mas rápido que
ext3, asi que ojo con esto.

saludos

pgman
Post by Alvaro Herrera
Post by Mario Wojcik
A todo esto, cual sistema de archivos consideras que es la mejor opcion?
O cual es el que usas generalmente?
ext3
Alguna vez fui fanático de ReiserFS, pero hace dos días destruí la única
partición que me quedaba (un /home que se fue en un PC que vendí) y
nunca lo he echado de menos. Lo único que ext3 no tiene es lo de "tail
packing", pero no es un tema que me quite el sueño.
También usé XFS, pero a decir verdad nunca hice ninguna prueba ni
comparación.
--
Alvaro Herrera
http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
---------------------------(fin del mensaje)---------------------------
TIP 3: si publicas/lees desde Usenet, por favor envía "subscribe-nomail"
a los suscriptores de la lista
Alvaro Herrera
2007-05-15 20:05:13 UTC
Permalink
Post by eduardo arenas
Estimado, los expertos en DB señalan que ext2 es 7 veces mas rápido que
ext3, asi que ojo con esto.
No hay manera de discutir aseveraciones sin fundamento ni explicacion.
Hay buenas razones por las cuales ext3 es mas lento, y hay maneras de
optimizar ext3 (==> hacerlo mas rapido).

Si tienes una instalacion grande y donde el rendimiento es importante,
puedes usar ext2 con Postgres. Pero no a tontas y a locas; hay que
configurar con cuidado.
--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.
Mario Gonzalez
2007-05-15 20:12:23 UTC
Permalink
Post by Alvaro Herrera
Si tienes una instalacion grande y donde el rendimiento es importante,
puedes usar ext2 con Postgres. Pero no a tontas y a locas; hay que
configurar con cuidado.
Creo que si un administrador quiere deshacerse del journal que
provee ext3 necesita pensarlo mas de una vez.

Si no estas conforme con el rendimiento de ext3 y quieres probar
otro FS, te pudiera recomendar XFS.
--
http://www.advogato.org/person/mgonzalez/
Alvaro Herrera
2007-05-15 20:17:13 UTC
Permalink
Post by Mario Gonzalez
Post by Alvaro Herrera
Si tienes una instalacion grande y donde el rendimiento es importante,
puedes usar ext2 con Postgres. Pero no a tontas y a locas; hay que
configurar con cuidado.
Creo que si un administrador quiere deshacerse del journal que
provee ext3 necesita pensarlo mas de una vez.
Lo que pasa es que WAL ya es un journal, y por lo tanto es redundante
tener ademas el journal de ext3. Asi que puede ser buena idea poner WAL
en un sistema de archivos ext2. Pero el directorio de datos es mejor
que quede en ext3 -- con el journal configurado para registrar solo
metadatos, no datos (porque los datos estan en el journal de WAL, por lo
tanto es innecesario). La configuracion por omision de ext3 registra
datos.

La verdad es que no he visto ningun benchmark que compare estas cosas.
Las comparaciones que he visto entre ext3 y XFS (por ej.) solo comparan
con la configuracion por omision de ext3, asi que en realidad no
significan nada.
--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.
Mario Gonzalez
2007-05-15 20:27:43 UTC
Permalink
Post by Alvaro Herrera
La verdad es que no he visto ningun benchmark que compare estas cosas.
Las comparaciones que he visto entre ext3 y XFS (por ej.) solo comparan
con la configuracion por omision de ext3, asi que en realidad no
significan nada.
mmhh, he visto y he probado que XFS se comporta mejor especialmente
en escrituras para archivos grandes, sobre 1 Giga en adelante. Mas
aun; para archivos mayores de 1 tera XFS es mucho mejor que ext3.

Por lo que XFS se comporta casi de la misma forma que EXT3 en
archivos de aprox. 500megas, y para archivos de menor tamaño la
diferencia es tan minima que da lo mismo cual uses. Lo que no he
probado es cambiar parametros para optimizar ext3.

Tienes razon y estoy de acuerdo contigo que para el directorio de
datos, sin contar el WAL, debiera estar sobre un FS con journal. No
estoy seguro pero creo que NTFS entra en estsa categoria tambien.
--
http://
Alvaro Herrera
2007-05-15 20:31:01 UTC
Permalink
Post by Mario Gonzalez
Post by Alvaro Herrera
La verdad es que no he visto ningun benchmark que compare estas cosas.
Las comparaciones que he visto entre ext3 y XFS (por ej.) solo comparan
con la configuracion por omision de ext3, asi que en realidad no
significan nada.
mmhh, he visto y he probado que XFS se comporta mejor especialmente
en escrituras para archivos grandes, sobre 1 Giga en adelante. Mas
aun; para archivos mayores de 1 tera XFS es mucho mejor que ext3.
Bueno, recuerda que Postgres usa archivos de 1 GB maximo.
Post by Mario Gonzalez
Lo que no he probado es cambiar parametros para optimizar ext3.
Hace una diferencia importante (yo lo medi alguna vez)
--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.
Mario Gonzalez
2007-05-15 20:36:02 UTC
Permalink
Post by Alvaro Herrera
Post by Mario Gonzalez
mmhh, he visto y he probado que XFS se comporta mejor especialmente
en escrituras para archivos grandes, sobre 1 Giga en adelante. Mas
aun; para archivos mayores de 1 tera XFS es mucho mejor que ext3.
Bueno, recuerda que Postgres usa archivos de 1 GB maximo.
si
Post by Alvaro Herrera
Post by Mario Gonzalez
Lo que no he probado es cambiar parametros para optimizar ext3.
Hace una diferencia importante (yo lo medi alguna vez)
ok, buscare mas informacion al respecto y me comprometo a publicar
los resultados.
--
http://www.advogato.org/person/mgonzalez/
Jaime Casanova
2007-05-13 06:28:03 UTC
Permalink
Supongo que las negritas fueron obra de html, evita eso. No todos usan
clientes de correo que soporten html y no haran el esfuerzo de
entender el texto simplemente se saltaran tu correo...
Post by Orlando Ramirez
Estoy migrando una base de datos de Sybase a Postgres y en muchos de los
SELECT de sus procedientos almacenados se usa la declaracion AS.
Agradezco a Jaime Casanova por diligente su comentario, aunque no alcanzo a
comprender la solución que propone,
Alvaro comentaba que no puedes usar el nombre que le asignaste a la
columna con el AS porque va en contra de las reglas del estandar SQL
(lo que implica que sybase esta actuando mal)... o al menos eso
entendi yo... la verdad, estuve rebuscando en el estandar porque
pienso que Alvaro tiene razon pero no encuentro la parte relevante...

ademas de que el distinct que estas usando parece una funcion que
aparentemente solo afecta a la primera columna (otra vez fuera del
estandar, imagino que es similar al distinct on de postgres)

mi solucion fue poner en el FROM un subquery que obtenga el substring
y le de el nombre que quieres, el group by es para evitar que se
repitan los valores. tambien encontre que es mas eficiente hacer un
join con la misma tabla para obtener la descripcion en vez de con un
subquery...

viendo el query real que intentas re-escribir veo que el problema es
mas complejo de lo que habias dicho y por lo tanto segun veo debes
añadir un subquery mas para el sum... mmm...
Post by Orlando Ramirez
y a Alvaro Herrera por el suyo en donde lo mas saltante es su ironica frase: Que modelo tan horrible. Lo que no
comprende Alvaro es que existen estructuras de datos en donde el usuario lo
tiene definido de esa manera y se vienen usando asi por siglos. En este caso
concreto, esta es una tabla que contiene un plan de cuentas contable.
que se haya usado por siglos no lo hace un modelo *bonito*, de hecho
yo concuerdo con alvaro... el simple hecho de que el modelo te permita
crear una cuenta detalle sin su respectivo padre (la cuenta de 8
digitos parece ser el padre de las de mas digitos) muestra lo pobre
del modelo... e imagino que añadieron ahi el saldo para optimizar
consultas, aun asi necesitas esa consulta con varias subconsultas que
no me parece muy optimo que digamos... y no digamos del trabajo de
actualizar esa tabla en cada movimiento contable (el saldo de la
cuenta detalle y la de sus padres =()

lo siento, pero que la gente haya pensado durante siglos que el sol
giraba alrededor de la tierra no lo hizo verdad... del mismo modo que
ese modelo se haya usado (tambien he visto esas cosas en mi pais) no
lo hace un buen modelo... solo un error muy replicado...
--
Atentamente,
Jaime Casanova

"Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs and the universe trying
to produce bigger and better idiots.
So far, the universe is winning."
Richard Cook
Gabriel Hermes Colina Zambra
2007-05-13 15:48:36 UTC
Permalink
Post by Jaime Casanova
ademas de que el distinct que estas usando parece
una funcion que
aparentemente solo afecta a la primera columna (otra
vez fuera del
estandar, imagino que es similar al distinct on de
postgres)
mi solucion fue poner en el FROM un subquery que
obtenga el substring
y le de el nombre que quieres, el group by es para
evitar que se
repitan los valores. tambien encontre que es mas
eficiente hacer un
join con la misma tabla para obtener la descripcion
en vez de con un
subquery...
viendo el query real que intentas re-escribir veo
que el problema es
mas complejo de lo que habias dicho y por lo tanto
segun veo debes
añadir un subquery mas para el sum... mmm...
Post by Orlando Ramirez
y a Alvaro Herrera por el suyo en donde lo mas
saltante es su ironica frase: Que modelo tan
horrible. Lo que no
Post by Orlando Ramirez
comprende Alvaro es que existen estructuras de
datos en donde el usuario lo
Post by Orlando Ramirez
tiene definido de esa manera y se vienen usando
asi por siglos. En este caso
Post by Orlando Ramirez
concreto, esta es una tabla que contiene un plan
de cuentas contable.
que se haya usado por siglos no lo hace un modelo
*bonito*, de hecho
yo concuerdo con alvaro... el simple hecho de que el
modelo te permita
crear una cuenta detalle sin su respectivo padre (la
cuenta de 8
digitos parece ser el padre de las de mas digitos)
muestra ptimizar
consultas, aun asi necesitas esa consulta con varias
subconsultas que
no me parece muy optimo que digamos... y no digamos
del trabajo de
actualizar esa tabla en cada movimiento contable (el
saldo de la
cuenta detalle y la de sus padres =()
lo siento, pero que la gente haya pensado durante
siglos que el sol
giraba alrededor de la tierra no lo hizo verdad...
del mismo modo que
ese modelo se haya usado (tambien he visto esas
cosas en mi pais) no
lo hace un buen modelo... solo un error muy
replicado...
--
Atentamente,
Jaime Casanova
Saben que estoy leyendo este thread, por que me mande
una critica, no fue lo tecninca que fue esta, pero
despues me decidi a ver que solucion puedo aportar.

Me queda claro lo que decis distinct on debe ser la
solucion, asi como seria distinct row en mssql, el
distinct si asi se usa en sysbase, estoy seguro 99%
seguro que rompe el standard.

Y la verdad que viendo programas contables exitosos,
como Tango de Argentina y Memory de Uruguay,
exportados en Latino America con este fin, y algunos
de la madre patria, de los cuales librerias
prestigiosas como Anaya han publicado mucha
literatura, todos tienen su plan de cuenta organizado
de esta manera.

Y tiene su explicacion que el mismo campo de codigo
del rubro y subrubros del plan de cuenta sean
almacenados en la misma tabla.

Donde la dependencia como en el siguiente plan de
cuentas es de solo un digito por vez, o sea
1 es padre de 11,12,13 a su ves 11 es padre de 111,
112,113, 114, y 12 es es padre de 121, 122,123, 124
y asi sucesivamete segun la necesidad de ampliar este
tree (arbol), El tema es que se puede pedir el saldo
en cualquier nivel del arbol para una rama dada, no
necesariamente de 4 en 4 o de 3 en 3.
Igualmente voy a volver a la fuente del thread, por
que si vi otras cosas que no me gustaron, pero no
precisamente en este punto, te dejo aqui un plan de
cuenta x para que sea este quien detalle mejor el
problema que mi pobre ejemplo.

Atte.
Gabriel Hermes Colina Zambra.


"1","ACTIVO"
"11","DISPONIBILIDADES"
"111","CAJA"
"1111","Caja Moneda Nacional"
"112","BANCOS"
"1121","Bancos Moneda Nacional"
"1122","Bancos M. Extranjera "
"12","EXIGIBLE"
"121","DEUDORES VARIOS"
"1211","Deudores de Plaza"
"1212","Ventas c/tarjeta"
"122","CREDITOS DIVERSOS"
"1221","Cuenta de Socios"
"1222","I.V.A. s/compras 23%"
"1223","I.V.A. s/gastos 23%"
"1224","I.V.A. retenido "
"1225","I.R.I.C. anticipos"
"1226","Anticipos Patrimonio"
"1227","Cofis compras"
"1228","Anticipos Cofis"
"1291","Creditos solicitados"
"1292","Cred.Pasa al prox.ej."
"13","REALIZABLE"
"131","BIENES DE CAMBIO"
"1311","Mercaderias de Reventa"
"14","FIJO"
"141","BIENES DE USO"
"1411","Muebles y Utiles"
"141101","Muebles y utiles"
"141102","Instalaciones"
"141103","Vehiculos"
"1412","Inmuebles"
"1413","Maquinas y Herramient."
"1414","Vehiculos"
"1415","Mejoras e Inm arrend."
"145","AMORTIZ.ACUMULADAS"
"1451","Amort.Ac.Mueb.y Utiles"
"1452","Amort.Ac.Inmuebles"
"1453","Amort.Ac.Maq.y Herram."
"1454","Amort.Ac.Vehiculos"
"1455","Amort.INm arre"
"1461","Otros Activos"
"2","PASIVO"
"21","EXIGIBLE"
"211","DEUDAS COMERCIALES"
"2111","Acreedores Varios"
"2112","Cheques Difereidos"
"2113","cuentas a pagar"
"2114","Acreedores gastos"
"212","DEUDAS FINANCIERAS"
"2121","Prestamos Bancarios"
"2122","Prestamos Mda.Extranj."
"2123","Intereses a Pagar"
"2124","Intereses Mda.Extranj."
"2125","Intereses a Vencer"
"2126","Cheques dif. a vencer"
"213","DEUDAS DIVERSAS"
"2131","B.P.S."
"2132","Cta.Socios-S.Acreed."
"2133","I.V.A. s/ventas 23%"
"2135","D.G.I. - I.V.A."
"2136","Cofis Ventas"
"2137","Cofis Pago"
"3","PATRIMONIO"
"311","CAPITAL"
"3111","Capital Integrado"
"312","AJUSTES AL PATRIMONIO"
"3121","Revaluos Fiscales"
"3122","Revaluos Voluntarios"
"313","RESERVAS"
"3131","Reservas Legales"
"3132","Reservas Voluntarias"
"321","RESULTADOS"
"3211","Result.Ejerc.Anterior."
"3212","Result.del Ejercicio"
"4","INGRESOS"
"411","VENTAS BRUTAS"
"4111","Ventas Tasa Basica"
"421","INGRESOS FINANCIEROS"
"431","OTROS INGRESOS"
"4311","Descuentos Obtenidos"
"5","GASTOS"
"51","COSTO DE LO VENDIDO"
"5101","Compra de Mercaderias"
"52","GASTOS DE PRODUCCION"
"5201","Sueldos y Jornales"
"5202","Cargas Sociales"
"5203","Gastos Generales"
"5204","Rep. y Mantenimiento"
"5205","Gastos de Representac."
"5206","Gastos de Fletes"
"5207","Gastos de Vehiculos"
"5208","Servicios Contratados"
"5209","Papeleria e Imprenta"
"5211","Antel"
"5212","Impuestos"
"5213","Descuentos Concedidos"
"5214","Alquileres"
"5215","Seguros"
"5216","Consumo de Combustible"
"5217","Gastos Comunes Ute"
"5218","Gastos Comunes Sereno"
"5219","Gastos Comunes Limpiez"
"5221","Gastso Comunes Cajera"
"5222","Taxi"
"5223","gastos comunes"
"5224","gasto computacion"
"5225","Gastos central"
"54","GASTOS FINANCIEROS"
"5401","Intereses y Descuentos"
"5402","Diferencias de cambio"
"5403","Gastos de Tarjeta"
"5404","Costo Administrativo"
"5405","Multas y Recargos"
"5407","Gastos Bancarios"
"5408","Cofis no descontado"
"5409","Imp.PAt e Iric"
"5411","Amortizacion"
"55","RESULTADOS"
"5501","Resultados ej-2002"



__________________________________________________
Correo Yahoo!
Espacio para todos tus mensajes, antivirus y antispam ¡gratis!
Regístrate ya - http://correo.espanol.yahoo.com/
Gabriel Hermes Colina Zambra
2007-05-13 16:26:35 UTC
Permalink
Bueno probe algo

select distinct on (substr(descripcion,1,4))
descripcion as recorte,id_articulo,
precio_lista
from central.articulos

Si voy cambiando el 4 por otro numero, voy obteniendo
mas o menos filas, incluso probe con 1 y me devolvia
180, con 8 me daba 100000 es obvio el por que.

Esto actua sobre un campo solo, en este caso
descripcion, si quiero ponerle otro alias puedo
hacerlo en este caso recorte, pero me devuelve todo el
campo descripcion asi que si quiero despues puedo
hacer esto otro

select distinct on (substr(descripcion,1,4))
descripcion,substr(descripcion,1,4) as
recorte,id_articulo,
precio_lista
from central.articulos

Esto no varia mucho la escritura original que tenias,
pero la hace standard.

Suerte.

Atte.
Gabriel Hermes Colina Zambra.

__________________________________________________
Correo Yahoo!
Espacio para todos tus mensajes, antivirus y antispam ¡gratis!
Regístrate ya - http://correo.espanol.yahoo.com/
eduardo arenas
2007-05-16 20:11:00 UTC
Permalink
Orlando, prueba con la función

left Join

ya que lo que tienes de consultas anidadas se puede resolver de mejor manera
con esta instrucción.

saludos
Post by Gabriel Hermes Colina Zambra
Bueno probe algo
select distinct on (substr(descripcion,1,4))
descripcion as recorte,id_articulo,
precio_lista
from central.articulos
Si voy cambiando el 4 por otro numero, voy obteniendo
mas o menos filas, incluso probe con 1 y me devolvia
180, con 8 me daba 100000 es obvio el por que.
Esto actua sobre un campo solo, en este caso
descripcion, si quiero ponerle otro alias puedo
hacerlo en este caso recorte, pero me devuelve todo el
campo descripcion asi que si quiero despues puedo
hacer esto otro
select distinct on (substr(descripcion,1,4))
descripcion,substr(descripcion,1,4) as
recorte,id_articulo,
precio_lista
from central.articulos
Esto no varia mucho la escritura original que tenias,
pero la hace standard.
Suerte.
Atte.
Gabriel Hermes Colina Zambra.
__________________________________________________
Correo Yahoo!
Espacio para todos tus mensajes, antivirus y antispam ¡gratis!
Regístrate ya - http://correo.espanol.yahoo.com/
---------------------------(fin del mensaje)---------------------------
TIP 5: ¿Has leído nuestro extenso FAQ?
http://www.postgresql.org/files/documentation/faqs/FAQ.html
Jaime Casanova
2007-05-17 04:11:51 UTC
Permalink
Post by Jaime Casanova
mi solucion fue poner en el FROM un subquery que obtenga el substring
y le de el nombre que quieres, el group by es para evitar que se
repitan los valores. tambien encontre que es mas eficiente hacer un
join con la misma tabla para obtener la descripcion en vez de con un
subquery...
viendo el query real que intentas re-escribir veo que el problema es
mas complejo de lo que habias dicho y por lo tanto segun veo debes
añadir un subquery mas para el sum... mmm...
cuatro dias despues... por fin mi cerebro decidio trabajar y se me
ocurrio la forma de escribir esa consulta (tan obvio ahora, que no se
como no lo vi antes =)

SELECT codigo, (select des_cta from CUENTAS where cod_cta=codigo),
sum(mto_sld)
FROM (select substring(cod_cta from 1 for 8) as codigo, mto_sld
from CUENTAS WHERE length(cod_cta) > 8) as foo
GROUP BY 1, 2;

que es lo mismo que

SELECT substring(cod_cta from 1 for 8) as codigo,
(select des_cta from CUENTAS as foo
where cod_cta=substring(CUENTAS.cod_cta from 1 for 8)),
sum(mto_sld)
FROM CUENTAS
WHERE length(cod_cta) > 8
GROUP BY 1, 2;
--
Atentamente,
Jaime Casanova

"Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs and the universe trying
to produce bigger and better idiots.
So far, the universe is winning."
Richard Cook
Orlando Ramirez
2007-05-17 17:07:12 UTC
Permalink
Gracias Jaime, esta es la solucion que estaba buscando, lastima que por problemas de performance no la pueda utilizar.

Resulta que la tabla CUENTAS tiene aproximadamente 25,000 registros y en Sybase este query tarda un par de segundos y aqui resulta eficiente, pero cuando la ejecuto en Postgress tarda mucho tiempo (pasaron 20 minutos y no acababa por lo que lo cancele). Intenten hacer algo similar a esto en una tabla en Postgress del tipo <codigo: cod_cta> - <descripcion: des_cta> que contiene de muchos registros.

select codigo, (select des_cta from TABLA where cod_cta=codigo)
from (select substring(cod_cta,1,8) as codigo from TABLA
where length(cod_cta)>=8) as foo

Gracias tambien a Gabriel Hermes Colina Zambra y Eduardo Arenas por su aporte. En realidad comunidades como esta una bendición para todos.

Saludos
Post by Jaime Casanova
mi solucion fue poner en el FROM un subquery que obtenga el substring
y le de el nombre que quieres, el group by es para evitar que se
repitan los valores. tambien encontre que es mas eficiente hacer un
join con la misma tabla para obtener la descripcion en vez de con un
subquery...
viendo el query real que intentas re-escribir veo que el problema es
mas complejo de lo que habias dicho y por lo tanto segun veo debes
añadir un subquery mas para el sum... mmm...
cuatro dias despues... por fin mi cerebro decidio trabajar y se me
ocurrio la forma de escribir esa consulta (tan obvio ahora, que no se
como no lo vi antes =)

SELECT codigo, (select des_cta from CUENTAS where cod_cta=codigo),
sum(mto_sld)
FROM (select substring(cod_cta from 1 for 8) as codigo, mto_sld
from CUENTAS WHERE length(cod_cta) > 8) as foo
GROUP BY 1, 2;

que es lo mismo que

SELECT substring(cod_cta from 1 for 8) as codigo,
(select des_cta from CUENTAS as foo
where cod_cta=substring(CUENTAS.cod_cta from 1 for 8)),
sum(mto_sld)
FROM CUENTAS
WHERE length(cod_cta) > 8
GROUP BY 1, 2;
--
Atentamente,
Jaime Casanova

"Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs and the universe trying
to produce bigger and better idiots.
So far, the universe is winning."
Richard Cook



---------------------------------
Be a PS3 game guru.
Get your game face on with the latest PS3 news and previews at Yahoo! Games.
Alvaro Herrera
2007-05-17 17:24:11 UTC
Permalink
Post by Orlando Ramirez
Gracias Jaime, esta es la solucion que estaba buscando, lastima que
por problemas de performance no la pueda utilizar.
Huh, extraño. Manda por favor el EXPLAIN ANALYZE de ambas consultas.

Gracias Jaime por resolverlo ... yo hace dias que tengo un mail a medio
componer pero me habia dado pereza construir la consulta misma ;-)
Post by Orlando Ramirez
Resulta que la tabla CUENTAS tiene aproximadamente 25,000 registros y
en Sybase este query tarda un par de segundos y aqui resulta
eficiente, pero cuando la ejecuto en Postgress tarda mucho tiempo
(pasaron 20 minutos y no acababa por lo que lo cancele). Intenten
cod_cta> - <descripcion: des_cta> que contiene de muchos registros.
Hmm, si nos proporcionas un metodo rapido para generar datos de prueba.
--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.
Orlando Ramirez
2007-05-17 19:02:52 UTC
Permalink
Gracias por tu interes Alvaro.

Lo que hace el Postgress es recorrer la tabla CUENTAS secuencialmente y por cada registro de esta consulta vuelve a recorrer una instancia de la misma tabla tambien secuencialmente.

Si gustas te he preparado un archivo SQL que crea una tabla e inserta los registros correspondientes para efectos de prueba en otras BD. Lo puedes descargar de:

http://www.http-peru.com/prueba/cuentas.sql

Seria bueno probar este query en otros DBMS para efectos de benchmarking:

select codigo, (select des_cta from TABLA where cod_cta=codigo)
from (select substring(cod_cta,1,8) as codigo from TABLA
where length(cod_cta)>=8) as foo

Saludos
Post by Orlando Ramirez
Gracias Jaime, esta es la solucion que estaba buscando, lastima que
por problemas de performance no la pueda utilizar.
Huh, extraño. Manda por favor el EXPLAIN ANALYZE de ambas consultas.

Gracias Jaime por resolverlo ... yo hace dias que tengo un mail a medio
componer pero me habia dado pereza construir la consulta misma ;-)
Post by Orlando Ramirez
Resulta que la tabla CUENTAS tiene aproximadamente 25,000 registros y
en Sybase este query tarda un par de segundos y aqui resulta
eficiente, pero cuando la ejecuto en Postgress tarda mucho tiempo
(pasaron 20 minutos y no acababa por lo que lo cancele). Intenten
hacer algo similar a esto en una tabla en Postgress del tipo > cod_cta> - que contiene de muchos registros.
Hmm, si nos proporcionas un metodo rapido para generar datos de prueba.
--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

---------------------------(fin del mensaje)---------------------------
TIP 3: si publicas/lees desde Usenet, por favor envía "subscribe-nomail"
a majordomo-RDL/***@public.gmane.org para que tus mensajes puedan llegar
a los suscriptores de la lista



---------------------------------
Luggage? GPS? Comic books?
Check out fitting gifts for grads at Yahoo! Search.
Orlando Ramirez
2007-05-17 19:26:17 UTC
Permalink
Gracias por tu interes Alvaro.

Lo que hace el Postgress es recorrer la tabla CUENTAS secuencialmente y por cada registro de esta consulta vuelve a recorrer una instancia de la misma tabla tambien secuencialmente.

Si gustas te he preparado un archivo SQL que crea una tabla e inserta los registros correspondientes para efectos de prueba en otras BD. Lo puedes descargar de:

http://www.http-peru.com/prueba/cuentas.sql

Seria bueno probar este query en otros DBMS para efectos de benchmarking:

select codigo, (select des_cta from TABLA where cod_cta=codigo)
from (select substring(cod_cta,1,8) as codigo from TABLA
where length(cod_cta)>=8) as foo

Saludos
Post by Orlando Ramirez
Gracias Jaime, esta es la solucion que estaba buscando, lastima que
por problemas de performance no la pueda utilizar.
Huh, extraño. Manda por favor el EXPLAIN ANALYZE de ambas consultas.

Gracias Jaime por resolverlo ... yo hace dias que tengo un mail a medio
componer pero me habia dado pereza construir la consulta misma ;-)
Post by Orlando Ramirez
Resulta que la tabla CUENTAS tiene aproximadamente 25,000 registros y
en Sybase este query tarda un par de segundos y aqui resulta
eficiente, pero cuando la ejecuto en Postgress tarda mucho tiempo
(pasaron 20 minutos y no acababa por lo que lo cancele). Intenten
hacer algo similar a esto en una tabla en Postgress del tipo > cod_cta> - que contiene de muchos registros.
Hmm, si nos proporcionas un metodo rapido para generar datos de prueba.
--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

---------------------------(fin del mensaje)---------------------------
TIP 3: si publicas/lees desde Usenet, por favor envía "subscribe-nomail"
a majordomo-RDL/***@public.gmane.org para que tus mensajes puedan llegar
a los suscriptores de la lista



---------------------------------
Now that's room service! Choose from over 150,000 hotels
in 45,000 destinations on Yahoo! Travel to find your fit.
Alvaro Herrera
2007-05-17 22:49:14 UTC
Permalink
Post by Orlando Ramirez
Gracias por tu interes Alvaro.
Lo que hace el Postgress es recorrer la tabla CUENTAS secuencialmente y por cada registro de esta consulta vuelve a recorrer una instancia de la misma tabla tambien secuencialmente.
http://www.http-peru.com/prueba/cuentas.sql
Hmm, una idea es convertir el Subplan en un join ... creo que esto hace
lo que quieres:

SELECT codigo, des_cta
FROM (select substring(a.cod_cta from 1 for 8) as codigo, b.des_cta
from CUENTAS a, cuentas b
WHERE length(a.cod_cta) > 8 and
substring(a.cod_cta from 1 for 8) = b.cod_cta
) as foo
GROUP BY 1, 2;

La verdad es que el plan sigue siendo bastante malo, y las estimaciones
fallan muchisimo; mas aun, tuvo que usar tres pasos de Sort, usando 4 MB
en disco, para resolver esta consulta! Pero se demora 1.6 segundos, lo
cual supongo que es medianamente aceptable.

Este problema seria mucho menos malo si la manera de especificar la
jerarquia fuera especificando el padre de cada registro mas
explicitamente, y no tuvieras que usar el horrible substring() para eso.
En realidad ese es el principal problema del modelo.

Para ver si alguien se interesa en la salida de EXPLAIN ANALYZE de 8.3,
la pego abajo. Tiene dos diferencias con versiones anteriores:
1. muestra el uso de disco/memoria en los Sort
2. muestra los nombres de las columnas en algunos nodos que necesitan
mostrar columnas (versiones anteriores dicen "inner".foo = "outer".bar,
aca dice exactamente que columna y que expresion se esta calculando)

alvherre=# explain analyze SELECT codigo, des_cta
FROM (select substring(a.cod_cta from 1 for 8) as codigo, b.des_cta
from CUENTAS a, cuentas b WHERE length(a.cod_cta) > 8 and substring(a.cod_cta from 1 for 8) = b.cod_cta) as foo
GROUP BY 1, 2;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------
Group (cost=181905.21..193306.86 rows=912132 width=52) (actual time=1551.356..1624.042 rows=1082 loops=1)
-> Sort (cost=181905.21..184185.54 rows=912132 width=52) (actual time=1551.347..1585.564 rows=15360 loops=1)
Sort Key: ((("substring"((a.cod_cta)::text, 1, 8)))), b.des_cta
Sort Method: external sort Disk: 1160kB
-> Merge Join (cost=4072.13..29253.24 rows=912132 width=52) (actual time=769.400..1161.176 rows=15360 loops=1)
Merge Cond: ((("substring"((a.cod_cta)::text, 1, 8))) = (((b.cod_cta)::text)))
-> Sort (cost=1097.01..1116.50 rows=7798 width=21) (actual time=356.254..426.288 rows=20348 loops=1)
Sort Key: ("substring"((a.cod_cta)::text, 1, 8))
Sort Method: external merge Disk: 912kB
-> Seq Scan on cuentas a (cost=0.00..592.91 rows=7798 width=21) (actual time=0.026..80.879 rows=20348 loops=1)
Filter: (length(cod_cta) > 8)
-> Sort (cost=2975.13..3033.61 rows=23394 width=52) (actual time=413.105..508.041 rows=37669 loops=1)
Sort Key: ((b.cod_cta)::text)
Sort Method: external sort Disk: 1992kB
-> Seq Scan on cuentas b (cost=0.00..475.94 rows=23394 width=52) (actual time=0.034..75.988 rows=23394 loops=1)
Total runtime: 1633.384 ms
(16 rows)
--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
Arturo Munive
2007-05-17 23:13:38 UTC
Permalink
Post by Alvaro Herrera
Post by Orlando Ramirez
Gracias por tu interes Alvaro.
Lo que hace el Postgress es recorrer la tabla CUENTAS secuencialmente y por cada registro de esta consulta vuelve a recorrer una instancia de la misma tabla tambien secuencialmente.
http://www.http-peru.com/prueba/cuentas.sql
Hmm, una idea es convertir el Subplan en un join ... creo que esto hace
SELECT codigo, des_cta
FROM (select substring(a.cod_cta from 1 for 8) as codigo, b.des_cta
from CUENTAS a, cuentas b
WHERE length(a.cod_cta) > 8 and
substring(a.cod_cta from 1 for 8) = b.cod_cta
) as foo
GROUP BY 1, 2;
La verdad es que el plan sigue siendo bastante malo, y las estimaciones
fallan muchisimo; mas aun, tuvo que usar tres pasos de Sort, usando 4 MB
en disco, para resolver esta consulta! Pero se demora 1.6 segundos, lo
cual supongo que es medianamente aceptable.
Este problema seria mucho menos malo si la manera de especificar la
jerarquia fuera especificando el padre de cada registro mas
explicitamente, y no tuvieras que usar el horrible substring() para eso.
En realidad ese es el principal problema del modelo.
Para ver si alguien se interesa en la salida de EXPLAIN ANALYZE de 8.3,
1. muestra el uso de disco/memoria en los Sort
2. muestra los nombres de las columnas en algunos nodos que necesitan
mostrar columnas (versiones anteriores dicen "inner".foo = "outer".bar,
aca dice exactamente que columna y que expresion se esta calculando)
alvherre=# explain analyze SELECT codigo, des_cta
FROM (select substring(a.cod_cta from 1 for 8) as codigo, b.des_cta
from CUENTAS a, cuentas b WHERE length(a.cod_cta) > 8 and substring(a.cod_cta from 1 for 8) = b.cod_cta) as foo
GROUP BY 1, 2;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------
Group (cost=181905.21..193306.86 rows=912132 width=52) (actual time=1551.356..1624.042 rows=1082 loops=1)
-> Sort (cost=181905.21..184185.54 rows=912132 width=52) (actual time=1551.347..1585.564 rows=15360 loops=1)
Sort Key: ((("substring"((a.cod_cta)::text, 1, 8)))), b.des_cta
Sort Method: external sort Disk: 1160kB
-> Merge Join (cost=4072.13..29253.24 rows=912132 width=52) (actual time=769.400..1161.176 rows=15360 loops=1)
Merge Cond: ((("substring"((a.cod_cta)::text, 1, 8))) = (((b.cod_cta)::text)))
-> Sort (cost=1097.01..1116.50 rows=7798 width=21) (actual time=356.254..426.288 rows=20348 loops=1)
Sort Key: ("substring"((a.cod_cta)::text, 1, 8))
Sort Method: external merge Disk: 912kB
-> Seq Scan on cuentas a (cost=0.00..592.91 rows=7798 width=21) (actual time=0.026..80.879 rows=20348 loops=1)
Filter: (length(cod_cta) > 8)
-> Sort (cost=2975.13..3033.61 rows=23394 width=52) (actual time=413.105..508.041 rows=37669 loops=1)
Sort Key: ((b.cod_cta)::text)
Sort Method: external sort Disk: 1992kB
-> Seq Scan on cuentas b (cost=0.00..475.94 rows=23394 width=52) (actual time=0.034..75.988 rows=23394 loops=1)
Total runtime: 1633.384 ms
(16 rows)
Bueno , yo he resuelto esta consulta agregando una columna a la
tabla que menciona orlando...
no se si entiendo bien o no la consulta que el hace
el quiere mostrar todas las cuentas de mas 8 digitos o mas mostrando
solo los 8 primeros caracteres de cada código

es asi o me equivoco????
por que si es asi la consulta que yo hize (un select de los mas simples)
demora 0.17 segundos sin nigun tipo de indices en la tabla

pero aun no coloco la solucion por que no se si entendi bien el
problema, no quiero hacer el ridículo je je
Alvaro Herrera
2007-05-17 23:24:40 UTC
Permalink
Post by Arturo Munive
Bueno , yo he resuelto esta consulta agregando una columna a la
tabla que menciona orlando...
no se si entiendo bien o no la consulta que el hace
el quiere mostrar todas las cuentas de mas 8 digitos o mas mostrando
solo los 8 primeros caracteres de cada código
Claro, modificando la tabla es muy facil solucionar el problema de
maneras mas eficientes.
--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.
Arturo Munive
2007-05-17 23:33:26 UTC
Permalink
Post by Alvaro Herrera
Post by Arturo Munive
Bueno , yo he resuelto esta consulta agregando una columna a la
tabla que menciona orlando...
no se si entiendo bien o no la consulta que el hace
el quiere mostrar todas las cuentas de mas 8 digitos o mas mostrando
solo los 8 primeros caracteres de cada código
Claro, modificando la tabla es muy facil solucionar el problema de
maneras mas eficientes.
Pero la modificación, que hice es mínima(solo agregué una columna y nada
mas), incluso le permite seguir teniendo esa estructura de códigos para
el plan de cuentas que tiene.

en fin, solo trataba de aportar un nuevo punto de vista
pero si el tema era resolverlo tal y como estaba (con subconsultas y
cosas por el estilo)
bueno entonces no he dicho nada
Jaime Casanova
2007-05-18 02:38:07 UTC
Permalink
Post by Arturo Munive
Post by Alvaro Herrera
Post by Arturo Munive
Bueno , yo he resuelto esta consulta agregando una columna a la
tabla que menciona orlando...
no se si entiendo bien o no la consulta que el hace
el quiere mostrar todas las cuentas de mas 8 digitos o mas mostrando
solo los 8 primeros caracteres de cada código
Claro, modificando la tabla es muy facil solucionar el problema de
maneras mas eficientes.
Pero la modificación, que hice es mínima(solo agregué una columna y nada
mas), incluso le permite seguir teniendo esa estructura de códigos para
el plan de cuentas que tiene.
precisamente, si vas a modificar tablas... mejor arreglar el diseño
que tiene en vez de dañarlo aun mas...
Post by Arturo Munive
en fin, solo trataba de aportar un nuevo punto de vista
pero si el tema era resolverlo tal y como estaba (con subconsultas y
cosas por el estilo)
bueno entonces no he dicho nada
lo que lo hace interesante es el porque se demora tanto siendo una
tabla tan pequeña, postgres deberia ser capaz de ejecutar una consulta
en esa tabla rapidamente y no (como efectivamente pasa) en varios
minutos
--
Atentamente,
Jaime Casanova

"Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs and the universe trying
to produce bigger and better idiots.
So far, the universe is winning."
Richard Cook
Arturo Munive
2007-05-18 03:14:45 UTC
Permalink
Post by Jaime Casanova
Post by Arturo Munive
Post by Alvaro Herrera
Post by Arturo Munive
Bueno , yo he resuelto esta consulta agregando una columna a la
tabla que menciona orlando...
no se si entiendo bien o no la consulta que el hace
el quiere mostrar todas las cuentas de mas 8 digitos o mas mostrando
solo los 8 primeros caracteres de cada código
Claro, modificando la tabla es muy facil solucionar el problema de
maneras mas eficientes.
Pero la modificación, que hice es mínima(solo agregué una columna y nada
mas), incluso le permite seguir teniendo esa estructura de códigos para
el plan de cuentas que tiene.
precisamente, si vas a modificar tablas... mejor arreglar el diseño
que tiene en vez de dañarlo aun mas...
No sabía que su diseño ya estaba dañado...

lo que lo hace interesante es el porque se demora tanto siendo una
Post by Jaime Casanova
tabla tan pequeña, postgres deberia ser capaz de ejecutar una consulta
en esa tabla rapidamente y no (como efectivamente pasa) en varios
minutos
Ok ya entendí el punto

Jaime Casanova
2007-05-18 02:42:12 UTC
Permalink
Post by Alvaro Herrera
Post by Orlando Ramirez
Gracias por tu interes Alvaro.
Lo que hace el Postgress es recorrer la tabla CUENTAS secuencialmente y por cada registro de esta consulta vuelve a recorrer una instancia de la misma tabla tambien secuencialmente.
http://www.http-peru.com/prueba/cuentas.sql
Hmm, una idea es convertir el Subplan en un join ... creo que esto hace
SELECT codigo, des_cta
FROM (select substring(a.cod_cta from 1 for 8) as codigo, b.des_cta
from CUENTAS a, cuentas b
WHERE length(a.cod_cta) > 8 and
substring(a.cod_cta from 1 for 8) = b.cod_cta
) as foo
GROUP BY 1, 2;
La verdad es que el plan sigue siendo bastante malo, y las estimaciones
fallan muchisimo; mas aun, tuvo que usar tres pasos de Sort, usando 4 MB
en disco, para resolver esta consulta! Pero se demora 1.6 segundos, lo
cual supongo que es medianamente aceptable.
el plan mejora en algo si haces un set enable_mergejoin=off;

QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------
Group (cost=255656.36..267058.01 rows=912132 width=52) (actual
time=368.261..425.734 rows=1082 loops=1)
-> Sort (cost=255656.36..257936.69 rows=912132 width=52) (actual
time=368.247..392.925 rows=15360 loops=1)
Sort Key: ("substring"((a.cod_cta)::text, 1, 8)), b.des_cta
Sort Method: external merge Disk: 1096kB
-> Hash Join (cost=678.38..106119.39 rows=912132 width=52)
(actual time=86.187..251.804 rows=15360 loops=1)
Hash Cond: ((b.cod_cta)::text =
"substring"((a.cod_cta)::text, 1, 8))
-> Seq Scan on cuentas b (cost=0.00..463.94
rows=23394 width=52) (actual time=0.035..15.945 rows=23394 loops=1)
-> Hash (cost=580.91..580.91 rows=7798 width=21)
(actual time=85.999..85.999 rows=20348 loops=1)
-> Seq Scan on cuentas a (cost=0.00..580.91
rows=7798 width=21) (actual time=0.022..33.218 rows=20348 loops=1)
Filter: (length(cod_cta) > 8)
Total runtime: 437.343 ms
(11 rows)
--
Atentamente,
Jaime Casanova

"Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs and the universe trying
to produce bigger and better idiots.
So far, the universe is winning."
Richard Cook
Jaime Casanova
2007-05-18 02:44:08 UTC
Permalink
Post by Jaime Casanova
Post by Alvaro Herrera
Post by Orlando Ramirez
Gracias por tu interes Alvaro.
Lo que hace el Postgress es recorrer la tabla CUENTAS secuencialmente y por cada registro de esta consulta vuelve a recorrer una instancia de la misma tabla tambien secuencialmente.
http://www.http-peru.com/prueba/cuentas.sql
Hmm, una idea es convertir el Subplan en un join ... creo que esto hace
SELECT codigo, des_cta
FROM (select substring(a.cod_cta from 1 for 8) as codigo, b.des_cta
from CUENTAS a, cuentas b
WHERE length(a.cod_cta) > 8 and
substring(a.cod_cta from 1 for 8) = b.cod_cta
) as foo
GROUP BY 1, 2;
La verdad es que el plan sigue siendo bastante malo, y las estimaciones
fallan muchisimo; mas aun, tuvo que usar tres pasos de Sort, usando 4 MB
en disco, para resolver esta consulta! Pero se demora 1.6 segundos, lo
cual supongo que es medianamente aceptable.
el plan mejora en algo si haces un set enable_mergejoin=off;
cuando aprendere que si uso gmail debo adjuntar los explains por
separado porque aqui se ven horribles =)
--
Atentamente,
Jaime Casanova

"Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs and the universe trying
to produce bigger and better idiots.
So far, the universe is winning."
Richard Cook
Arturo Munive
2007-05-17 22:05:37 UTC
Permalink
yo se que no es exactamente la solución
pero no es mas fácil

tener ese campo como entero
osea como un integer

es decir la cosa seria simple si las cuentas
1
12
126
128
fueran
10000000000
12000000000
12600000000
12800000000

asi si se consulta por cuentas a n digitos se podri resolver con simples
menor y mayor comparados por multiplos de 10

ahora a la hora de insertar para insertar 25 y quede como 25000000000
y que 256898 que 25689800000

es decir
25
256898

quedan como
se puede hacer

25000000000
25689800000

eso hacerlo con una función muy simple (juego de niños) esa luego llamarla
desde un trigger

asi uno se olvida de substring y subconsultas y trabaja con comparaciones
multiplos de 10

o me equivoco?
Loading...