[SOLUCIONADO] Vistas en Postgres vs. Toba? - Optimizar outer joins anidados

Hola, quería saber como podía relacionar una vista de la bdd en postgre con un datos_tabla.
Básicamente, es una tabla de solo lectura, pero no encontré la forma de relacionarla.
Aparece en la lista de tablas de la fuente de datos, pero no aparece en la lista de seleccionables de los datos tabla. Solo en la de dimensiones…
Hay alguna API de toba_db que me permita recuperar las filas que lleva esa vista?

En particular, la necesito para resolver una consulta con muchos outer join que tarda bastante en resolverse por esa condición… incluso, pese a que su resultado son 15 columnas, agrupadas, cuelga el proceso de exportación a pdf (la única consulta que me lo hace en todo el proyecto).

Por ahora, la tengo definida en forma estática (no como datos_tabla, específico), sino como PHP y llamo a esa función para recuperar los datos.
Para que se den una idea, para devolver 32 filas demora entre 23 y 35 segundos… en mi pc, y accediendo a localhost (con a lo sumo 50 registros interviniendo en la relacion)… será impracticable en estas condiciones en producción.

Actualmente, basándome en un email que recibí hace mucho como parte de la comunidad:

Marcelo Azcurra escribió: Hola a todos

Tengo la siguiente duda a estoy utilizando el toba 1.3.1 y tengo que hacer algunas consultas en sql, puedo utilizar la palabra LEFT JOIN e INNER JOIN en mis consultas o puede acarrear algun problema con respecto a los perfiles funcionales para los usuarios donde se definen restriciones

Cordialmente
Marcelo Azcurra
Hola Marcelo,
Actualmente los perfiles de datos sólo encuentran correctamente las tablas si el join se hace implícito. Por ejemplo

SELECT

FROM
tabla_a a,
tabla_a b
WHERE
a.id = b.id

Por lo que tus consultas no se van a filtrar automáticamente al pasar por toba::perfil_de_datos()->filtrar($sql).
De todas formas el filtrado automático es opcional, tenés la posibilidad de usar una API de más bajo nivel, perdile los valores a filtrar y concaternarlos manualmente a la SQL. De esta forma te aseguras que las cosas se filtran cuando y cómo vos quieras. Por ejemplo si tuvieras una dimensión dependencias:

    $dependencias = toba::perfil_de_datos()->get_restricciones_dimension('mi_fuente', 'dependencias');
    $valores_posibles = implode(', ', $dependencias); 
    $sql = "SELECT ...
            FROM
                ...
            WHERE
                x.dependencia IN ($valores_posibles);
    ";    

Saludos,
Seba

No utilizo los JOINS sino que los resuelvo en forma directa = (b.id es NULL) o (b.id = a.id), parafraseando el ejemplo de la cita. Quizá esto esté resuelto (estoy usando la versión 1.4.x, y migraremos a la 1.5) y el uso de los JOINs me permita de alguna forma optimizar la consulta.

Apreciando cualquier ayuda en este contexto, les envio saludos a todos!

Hola Martin,

Aclarame algo, todo este proceso que estas haciendo es para mostrar datos o para editarlos?, lo que me llama la atencion es que hablas de una consulta con outer joins y de exportacion a pdf.
Recorda que la idea detras de los datos_tabla siempre es la edicion, si no es el caso es mucho mejor usar una consulta SQL derecho en lugar de un datos_tabla… hay mucho menos overhead involucrado.
Puesto de otra manera, si tuviera una operacion de dos pantallas, en la primera filtro - cuadro y en la segunda varios formularios que impactan distintas tablas, aun asi seguiria cargando el cuadro a base de SQL y solo utilizaria los datos_tabla/relacion para el momento de la edicion. Contame un poco mas cual es la situacion para poder orientarte mejor.

No utilizo los JOINS sino que los resuelvo en forma directa = (b.id es NULL) o (b.id = a.id), parafraseando el ejemplo de la cita. Quizá esto esté resuelto (estoy usando la versión 1.4.x, y migraremos a la 1.5) y el uso de los JOINs me permita de alguna forma optimizar la consulta.
En la version 1.5 se incluyo soporte para la sintaxis basada en JOINs en la determinacion de las dimensiones involucradas en una consulta. De todas formas, tranquilamente podes hacer uso del producto cartesiano como hasta ahora.

Saludos

Es solo para mostrar… por ahora, lo estoy cargando directamente desde una consulta plana… sin datos_tabla de por medio.
Pero llamando a toba_db::consultar($sql);
Capaz se me está escapando alguna api que ayude? o alguna forma de hacerlo más directo.

Ojo… igualmente, hay gran overhead en el mismo servidor… si corro la consulta en el pgAdmin, también demora aproximadamente eso… no es la carga del cuadro, es la consulta en si misma.

Así que, aprovecharé cualquier dato que me puedas aportar desde Toba, pero si o si, tengo que ver como optimizar la consulta desde Postgres…

Listo… resolví dividiendo la consulta… y haciendo el acceso a través de 2 operaciones, que también quedan coherentes y tiene relación con perfiles de datos (es decir, de esta forma, me puedo manejar directamente con perfiles funcionales).
La división la hice en el primer outer join (del cual eventualmente dependen otros si no es null), y se resuelven ambas en ms.
Gracias, como siempre!!!