Bueno aca llego finalmente al foro y como no podia ser de otra forma con un tema venenoso XD.
Tengo una maquina virtual instalada con XP SP2 + PHP 5.2.9 + PostgreSQL 8.4.0.1 default settings (Yiya Murano Tuned! :P) la situacion que se me presenta es la siguiente,
tengo SQLs con subqueries anidados las cuales ‘dejaron de funcar’, el sintoma pareciera estar en la profundidad de anidamiento, con lo
cual todas las SQL que genero de la misma forma me vuelan al diablo, voy a tratar de mantenerlo simple para no hacerles mucha ensalada.
Intente generar algo a manopla sobre el proyecto toba_referencia, pero lo cierto es que no consegui reproducir exactamente
el caso, asi que les pasteo una SQL concreta a modo de ejemplo (por cierto van a necesitar una base toba si quieren probar esto).
SELECT
columnas.objeto_proyecto,
columnas.objeto,
columnas.col_id,
columnas.columna,
columnas.tipo,
columnas.pk,
columnas.secuencia,
columnas.largo,
columnas.no_nulo,
columnas.no_nulo_db,
columnas.externa
FROM
desarrollo.apex_objeto_db_registros_col as columnas
WHERE
(columnas.objeto_proyecto, columnas.objeto) IN (
(
SELECT
prop_basicas.objeto_proyecto,
prop_basicas.objeto
FROM
desarrollo.apex_objeto_db_registros as prop_basicas
WHERE
(prop_basicas.objeto_proyecto, prop_basicas.objeto) IN (
SELECT
base.proyecto,
base.objeto
FROM
desarrollo.apex_objeto as base
WHERE
base.proyecto = 'toba_editor' AND
base.objeto = '1977' )))
La madre del borrego esta en que la consulta me devuelve unicamente 1 fila, cuando deberia estar devolviendo unas 10 o 12 filas.
Si quito la primer subquery
SELECT
prop_basicas.objeto_proyecto,
prop_basicas.objeto
FROM
desarrollo.apex_objeto_db_registros as prop_basicas
WHERE
(prop_basicas.objeto_proyecto, prop_basicas.objeto) IN
funciona, mas chingado aun es lo siguiente:
SELECT
columnas.objeto_proyecto,
columnas.objeto,
columnas.col_id,
columnas.columna,
columnas.tipo,
columnas.pk,
columnas.secuencia,
columnas.largo,
columnas.no_nulo,
columnas.no_nulo_db,
columnas.externa
FROM
desarrollo.apex_objeto_db_registros_col as columnas
WHERE
(columnas.objeto_proyecto, columnas.objeto) IN (SELECT NULL, NULL UNION ALL
(
SELECT
prop_basicas.objeto_proyecto,
prop_basicas.objeto
FROM
desarrollo.apex_objeto_db_registros as prop_basicas
WHERE
(prop_basicas.objeto_proyecto, prop_basicas.objeto) IN (
SELECT
base.proyecto,
base.objeto
FROM
desarrollo.apex_objeto as base
WHERE
base.proyecto = 'toba_editor' AND
base.objeto = '1977' )))
Que tambien hace que la SQL original funcione, aunque claramente es una porqueria de proporciones biblicas.
A primera vista la SQL me parece normal, hay algo en particular que piensen esta mal encarado?.
Originalmente pensamos en esta forma como un JOIN encubierto mas sencillo de generar que la forma estandar.
Si hay algo que se puede mejorar bienvenidas son todas las sugerencias :).
Finalmente, por otro lado encontre lo siguiente:
Que no se si este relacionado con este caso particular, la pregunta es, vale la pena que le dedique tiempo a explorar el parche ese?
Saludos y gracias
Richard
PD: Disculpen el abuso de quote :P… por cierto el [‘code’] esta reservado, pero no hace nada visualmente me parece, vendria bien para distinguirlo de las citas
Que tal Richard,
efectivamente es un bug de cuando retorna solo una fila los SEMI-JOINS.
En el segundo caso funciona , porque estás obligando a la consulta a retornar
más de un registro.
Aplicar el parche es relativamente sencillo, el problema es que abria que recompilar
en windows y eso es bastante rebuscado.
Justo lo estaba testeando en una VM con windows… pero no problemo me bajo el src del 8.4 y lo vemos. Si tenes algun preset de compilacion es el momento de pasarmelo, sino uso el metodo mercenario (como en los ultimos años), por ende confiabilidad de resultado -90.9% .
@Esteban
Gracias por la habilitacion señor le daremos el uso pertinente de ahora en mas ;).
Estas compilando con mingw? o con visual studio?
Porqué Windows?! XP?
Preset de compilación? Yo trabajo mucho con solaris, y generalmente lo compilo con
Sun Studio. Sinceramente, de compilación en Windows no tengo mucha experiencia (con
respecto a C+pgsql).
Es más, en teoría el patch esta pusheado, si te bajas el source debería estar el cambio (más
otros que encontraron, como por ejemplo el overload de array_agg).
Uso XP para las pruebas porque asi aprovecho a testear algunas cosas locas con IE 8 y ademas porque la gran mayoria aun usa windows asi que se parece mas que realizando la prueba con IE6 en linux.
Preset de compilación? Yo trabajo mucho con solaris, y generalmente lo compilo con
Sun Studio. Sinceramente, de compilación en Windows no tengo mucha experiencia (con
respecto a C+pgsql).
Es más, en teoría el patch esta pusheado, si te bajas el source debería estar el cambio (más
otros que encontraron, como por ejemplo el overload de array_agg).
Te preguntaba porque en la reunion anterior habias dicho que ibas a hacer ciertas recomendaciones a la hora de compilar el postgres y queria saber si habia algun conjunto de switches en particular que debia setear, mas que nada pa tener los dos algo similar.
Por Windows no te hagas drama… lo pensaba compilar en Linux con Gcc 4.3.3, el disco que le asigne a la VM no es tan grande como pa meterle un Visual Studio adentro.
OK me baje el src ayer asi que lo tiro asi como m****a al rio y que salga lo que dios quiera XD… cuando lo tenga andando te aviso por skype.