[Ror-es] ¿Fallo mío o del rails?

Fernando Calatayud ruby-forum-incoming at andreas-s.net
Thu Jun 12 11:13:35 GMT 2008


javier ramirez wrote:
> Hola,
> 
>> created_at. Y fijaos mi sorpresa al repasar las SQLs generadas:
>>   
> 
> sorpresa por no leerte la doc de los cambios en rails ;)
>> Producto Load IDs For Limited Eager Loading
>>   
> query de la tabla principal
>> Producto Load Including Associations
>>   
> query de la tabla asociada uniendo con los id de la principal
> 
>> ¿Esto es un fallo de programación del Rails (2.0.2, en mi caso), o es
>> que debería haberle pasado alguna condición que no le estoy pasando?
>>   
> 
> no es un fallo, sino una feature. Después de unas cuantas discusiones se
> decidió en rails core que el mecanismo de eager loading se cambiaba.
> 
> Cuando en tu select haces una include de sólo una tabla, no es un
> problema serio, pero si haces varios includes, entonces la select que se
> ejecuta es una select bastante grande cruzando todas las tablas y dando
> lugar a un resultset bastante grande. Al parecer, en muchos casos es más
> óptimo lanzar una query pequeña por tabla, que una query grande cruzando
> todas las tablas. Es por eso que primero se hace una query contra la
> tabla principal (lo que te dice como LIMITED eager loading), y luego se
> hace una query simple para cada tabla asociada buscando los ID
> directamente dentro de la misma tabla. De esta forma, el número de filas
> en memoria se reduce, y parece que en la base de datos también es más
> rápido.
> 
> A partir de ya, es la forma estándar de trabajar en rails, así que tenlo
> en cuenta en tus índices.
> 
> saludos,
> 
> javier ramírez


Gracias por la explicación; el mecanismo y la razón los intuía, pero lo 
que me sorprende y pienso que puede ser un fallo es que, teniendo el 
eager loading, no se utilice óptimamente. ¿Por qué hacer esto?

WHERE (productos.subtipo_id IN (81,
82, 83, 84, 85, 86, 87) and productos.plan_completo) AND `productos`.id
IN (35694, 35628, 35626)


En realidad, bastaría y sobraría con esto:

WHERE `productos`.id IN (35694, 35628, 35626)

Y fíjate si va a ir rápido, una búsqueda por ID!!


s2
-- 
Posted via http://www.ruby-forum.com/.


More information about the Ror-es mailing list