RailsでPostgreSQLのビュー(View)やマテリアライズド・ビュー(Materialized View)を使うためのGem「thoughtbot/scenic」の紹介です。
thoughtbot謹製ですので、安心して使えそうなのも魅力です!
🍄 PostgreSQLのViewとMaterialized View
PostgreSQLのViewとMaterialized Viewの大まかかな説明は次のとおりです。
View(ビュー)について
- ViewとはSQLで構成された実態のな仮想的なテーブルのこと。Viewの作成時にSQLを定義する
- Viewを呼び出すとSQLが即時実行される
- 最新の情報を常に取得できるが、SQLが複雑だったり、レコードが多いと負荷がかかる
Materialized View(マテリアライズド・ビュー)について
- 実態を持ったViewのことである。作成するときにSQLの実行結果のテーブルを作る
- 最新の情報を反映するためにはリフレッシュ処理を行う必要がある
- SQLが複雑だったり、レコードが多い処理の負荷を下げるのに有効なアプローチである
🗽 PostgreSQLのMaterialized Viewの機能
『RailsでPostgreSQLのマテリアライズドビューを使う | 日々雑記』にあるとおり、
PosgreSQLにはリフレッシュ時にSELECTコマンドを発行した時にロックされて応答が遅延しないように、CONCURRENTLY
というパラメータをつけるといいようです!
REFRESH MATERIALIZED VIEW CONCURRENTLY materialized_view; |
🏈 Gemのインストール
ではいよいよ、Viewを扱いやすくするGem「thoughtbot/scenic」の紹介です。
Gemfile
に以下を追加して、bundle install
を実行してください。
# View & Materialized View (GitHubじゃないとちょっと古い気がします) |
🐠 Viewを作成するためのModelを作成
まずは、Viewを作成するための元となるテーブルをScaffoldで作成します。
# 新しい Rails プロジェクトを作成 |
次にサンプルデータを作ります。
# db/seeds.rb |
ではテーブルを作って、テストデータを投入します。
# テーブルを作成 |
これでサンプルデータが作成されました。
🐮 いよいよマテリアライズド・ビューを作成
次にマテリアライズド・ビューを作成します。
今回は$50以上のBookをExpensiveBook
として、それを抽出するテーブルにします。
# ExpensiveBookの作成 |
🚕 マテリアライズド・ビューのSQL
そんなマテリアライズド・ビューのSQLがこちら。
# db/views/expensive_books_v01.sql |
あとはリフレッシュ時にCONCURRENTLY
を使うために、UNIQ INEXを追加します。
# db/migrate/20160106123247_create_expensive_books.rb |
ではマテリアライズド・ビューを作成します。
$ bundle exec rake db:migrate |
こんな感じのSQLが実行されたようです。
CREATE OR REPLACE VIEW public.expensive_books AS SELECT books.id, |
SQLを変更する場合は、rails g scenic:view expensive_book
とすれば変更用のSQLのmigrationファイル生成されます。
🚌 マテリアライズド・ビューのModelファイル
# app/models/expensive_book.rb |
一点GemのREADMEに書いていた注意点として、リフレッシュ時のパラメータにconcurrently: true
とした場合
はlockがかからないけど、PostgreSQL 9.4 以上 && uniq index
が必須なので注意してください。