2010/4/7 Lean <[email protected]>

> On Apr 7, 2010, at 3:48 PM, [email protected] wrote:
>
> Mis tablas no tienen más que id (PK), y los campos que menciono.
> Muy interesantes los consejos de "olvidate de SQL, trabajá con tus
> entidades", sin embargo, este problema se inició con otro problema sobre un
> modelo mucho más complejo y generó la inquietud de probar sobre algo más
> pavo. Resultó que tampoco funcionó.
>
> Les cuento el porqué de mi "capricho" con los joins: Tengo que hacer una
> búsqueda entre dos tablas: una de unos 40 millones de registros, relacionada
> vía FK con otra que tiene un millón y medio. Estas dos están relacionadas
> con 5 tablas más (bien chiquitas). Resulta que mis queries se volvieron
> complicados y -creanme- no me queda otra que utilizar los joins pero a
> través de un espantoso find_by_sql... :-(
>
> Imagínense que con este volúmen de datos, por cada registro de la tabla
> grande, rails me hace otro select para ubicar los registros en la tabla más
> chica. Ergo, una única consulta desencadena unas 40.000 consultas de un
> tirón cuando hago algo como:
>
> @hosts.map {|h| [h.cliente.nombre, h.hostname]}
>

esta misma línea de código, pero antecedida de

@hosts = Host.all :include => :cliente

desencadena solo 2 queries (si son 40k probablemente un poco más, pero las
contás con los dedos), más o menos así (esto no es exactamente lo que genera
AR, es similar):

SELECT * FROM hosts
SELECT * FROM clientes WHERE host_id IN (2, 4, 6, 8, 10)

y te devuelve un enumerable de Host propiamente dichos (no va a haber ningún
Host con datos de un cliente, por ejemplo)... pero cuando hagas
@hosts[0].cliente.nombre no necesita volver a la base -- ya lo tiene (esto
se puede hacer aún más lazy -- de hecho DataMapper no dispara la segunda
query hasta que realmente necesites al menos un cliente, pero si no me
equivoco así funciona AR).


> Quiero evitar todas esas consultas y entonces recurrí a los :joins. Probé
> con :include, probé con muchas cosas...
>

los joins te sirven para realizar consultas complejas (no afecta cómo se
mapean los resultados a objetos -- a diferencia de :select por ejemplo), y
en ese caso, tratá de encapsular esas consultas dentro de un named scope


> Por supuesto, ese volúmen no aplica en un problema como Host <-> Cliente,
> pero sí en los datos de captura de logs de un grupo muy grande de servidores
> (de ahi los 40M de registros!). Por simplicidad para con la pregunta a
> ustedes, resumí mi duda a un simple problema (donde reproduje el mismo
> problema que en el caso grande!)
>

se entiende, y sirvió perfectamente... la sugerencia sigue siendo: no
cambies la manera en que trabajás con los objetos, podés "ayudarlo" a la
hora de consultar a la base.

Gracias a todos, nuevamente.
>
> Leandro.
>

Saludos,

nachokb
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar

Responder a