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
