2012年9月2日日曜日

activerecord find_by_sqlのスピードアップ

find_by_sqlを使ったactiverecordのスピードアップ
activerecordを使った場合、モデルの情報しか取得出来ません。
例えば Book.find_by_sql("select books.*,authors,* from... left join ...")としてもbookの情報しか取得出来ないので、以下のようにしていました

    strSQL =  "select books.* from books
                        left join authors on authors.id = books.author_id;"
    strSQL2 =  "select authors.*  from books
                        left join authors on authors.id = books.author_id;"
    @books = Book.find_by_sql(strSQL)
    @authors = Author.find_by_sql(strSQL2)
これで、目的の情報は取得出来るのですが、時間が倍かかります。 Book.includes(:author).find_by_sql()としても読み込まれないので困っていました。 今日ふと以下のように変更すると、二回目のfind_by_sqlはキャッシュから取得していました。 これはいいかもしれない。これで取得時間が半分ぐらいになりました。(良かった。。。)
    strSQL =  "select books.*,authors.* from books
                        left join authors on authors.id = books.author_id;"
    @books = Book.find_by_sql(strSQL)
    @authors = Author.find_by_sql(strSQL)
これでfind_by_sqlの場合、includesを使わなくても先読みが出来ています。

0 件のコメント:

コメントを投稿