[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