パフォーマンスチューニング on Rails

Slides:



Advertisements
Similar presentations
SQL による数独の解法 青山学院大学理工学部 矢吹太朗・佐久田博司. 数独とは何か ナンプレとも呼ばれ る制約充足問題 各行・列・ブロック に 1 から 9 の数字を一 つずつ当てはめる 新聞等に載っている ものはとても簡単 人間には難しいもの → もある.
Advertisements

Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 Web アプリケーションを作ろう!
ネットワークからみるPCC 寺内康之.
DB(データベース)のおはなし 作成者:小野正広 DBと言っても、  ドラゴンボール ではないですぞ! 3/1/2017.
情報理工学部 情報システム工学科 ラシキアゼミ 3年 H 井奈波 和也
DBパフォーマンスチューニングの基礎 HN おいろん.
LZ圧縮回路の設計とハード・ソフト 最適分割の検討 電子情報デザイン学科 高性能計算研究室 4回生 中山 和也 2009/2/27.
JPAを利用した RESTful Webサービスの開発
PostgreSQLのKVS hstoreの紹介
Ruby on Rails 勉強会 11月5日「土」 崔 昌権
Explaining Explain ~ PostgreSQLの実行計画を読む ~
3-1 MySQLについて 発表者:藤村元彦 自然言語処理研究室.
MySQLに接続するデータベースプログラム
SharePoint Server において 構成ウィザードが失敗する場合の トラブルシューティング
talend活用事例 ・ナビゲータグラフのカスタマイズにおける事例 ・CSVダウンロードでのカスタマイズ事例
技術トピックス 2015/03.
SQL J2EE I 第3回 /
吉田和弘 株式会社ミッタシステム Rubyのすすめ 吉田和弘 株式会社ミッタシステム
事業計画 発表者名 | 会社名.
RDBMSについて 2年7組  小鹿 慎太郎.
3-2.データを取り出す 2004年 5月20日(木) 01T6074X 茂木啓悟.
岩井 儀雄 コンピュータ基礎演習  ー探索、整列ー 岩井 儀雄
第7章 データベース管理システム 7.1 データベース管理システムの概要 7.2 データベースの格納方式 7.3 問合せ処理.
 データベースによる並列処理 情報論理工学研究室  三宅健太.
09 06/23 PHP と SQL (MySQL) の連携 その2
SAP & SQL Server テクニカルアーキテクチャ概要 マイクロソフト株式会社 SAP/Microsoft コンピテンスセンター
14.テーブル定義,一対多の関係,多対多の関係, 外部キー,索引(インデックス),データベース操作
データベース設計 第9回 Webインタフェースの作成(1)
マイクロソフト Access での SQL 演習 第1回 SQL問い合わせ(クエリ)
入出力データ型に透過な Webサービス動的実行システム 松江工業高等専門学校 情報工学科 越田高志 情報処理学会第68回全国大会
データベースとJavaをつなげよう! ~JDBC~
データベース基礎 2016年3月10日 JWord株式会社 サービス開発部 中川 陽平.
2004/05/13 3-4 データ型(カラムタイプ) について 発表者:藤村元彦 自然言語処理研究室.
SQL パフォーマンス チューニング ~ カバーリングインデックス/クエリヒントの利用~
JDBC J2EE I 第4回 /
第2回.リレーショナルデータベース入門 SQL を用いたテーブルへの行の挿入 SQL 問い合わせの発行と評価結果の確認.
3-10. MySQLシステムの管理  2004年6月10日  大北高広                01T6010F.
第2回.リレーショナルデータベース入門 SQL を用いたテーブルへの行の挿入 SQL 問い合わせの発行と評価結果の確認.
SQL パフォーマンス チューニング ~ プランガイドの利用~
SQL Server Fast Track Data Warehouse 検証支援キャンペーン
第3回.テーブルの結合 結合条件 SQL を用いた結合問い合わせ.
第3回.テーブルの結合 結合条件 SQL を用いた結合問い合わせ.
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
JDBC データベース論 第12回.
PHP と SQL (MySQL) の連携 複数のテーブルを扱う
Javaによる Webアプリケーション入門 第7回
実行時情報に基づく OSカーネルのコンフィグ最小化
3-6.インデックスについて 3-7.関数と併用されることの 多いMySQLコマンド
3-3.テーブルを更新する 2004年 4月22日(木) 01T6074X 茂木啓悟.
コンピュータ概論B ー ソフトウェアを中心に ー #09 データベース (後編)
TIME SIGNAL: 集合知を利用した赤信号点灯時間の取得手法
オープンソース開発支援のための ソースコード及びメールの履歴対応表示システム
テーブル設計を後から変更 現場で使える小技のご紹介 株式会社ジーワンシステム 生島 勘富(イクシマ サダヨシ)
09 06/23 PHP と SQL (MySQL) の連携 その2
DS4000 EXP700 ESM ファームウエア更新手順 (ファームウエアレベル 9326)
PHP と SQL (MySQL) の連携 大量のデータを扱う
データベース設計 第4回 DBMSの機能と操作方法(1) Access入門
JDBC J2EE I (データベース論) 第5回 /
3-8・関数を使ってデータを取り出す   2004年6月3日(木) 01T6010F               大北高広.
ソフトウェア保守のための コードクローン情報検索ツール
3.リレーショナルデータベース,主キー, SQL
JDBC ソフトウェア特論 第3回.
Peer-to-Peerシステムにおける動的な木構造の生成による検索の高速化
再帰CTE を使って遊ぼう 大阪#9 2012/04/14.
CO-Client Opeartion 1.1 利用履歴データベースの設計 (スキーマ バージョン 対応)
09 06/23 PHP と SQL (MySQL) の連携 その3
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
第2回.リレーショナルデータベース入門 SQL を用いたテーブルへの行の挿入 SQL 問い合わせの発行と評価結果の確認.
SQL J2EE I (データベース論) 第3回 /
SQL データベース論 第11回.
Presentation transcript:

パフォーマンスチューニング on Rails Author: hmori Date:2008/01/07

パフォーマンスチューニングとは 「ハードウェアを最大限に活用する」ということ. 効率の悪い部分を突き止め、 最適なパフォーマンスを示すように、 システムのハードウェアやソフトウェアを分析し調整する.

チューニングの一般論 パフォーマンスは依存し合う多数の要因による チューニングは常にトレード・オフを伴う システムに影響を与えずに調査することは不可能 目標値の設定が必要(具体的な目標の設定) パフォーマンスチューニング手順 ①調査(Assess) ②測定(Measurement) ③分析(Analyze) ④特定(Identify)、調整(Tune)

前提 Railsのチューニング方法は多種にありますが、 ここではDBアクセスのチューニングを観点に 進めます。 ※DBはMySQLを前提としています

調査方法(1) Railsログ SQL、経過時間などが表示される. (※大抵これでわかる) development.log Completed in 0.98500 (1 reqs/sec) | Rendering: 0.04700 (4%) | DB: 0.62500 (63%) | 200 OK ↑ ↑ ↑ 1リクエストの時間  レンダリング DBアクセス

調査方法(2) SQLログ ボトルネックになっているSQLを探すのに適す. MySQLの場合 <my.ini> log-slow-queries #SlowLogの有効化(ログファイル名を指定可能)long query-time=1 #SlowLogに記録する処理時間(秒)の上限 log-long-format #インデックスを使用しないSQL文の記録

調査方法(3) Logファイル (mysql/data/{hostname}-slow.log) # Time: 080106 22:55:42 # User@Host: root[root] @ localhost [127.0.0.1] # Query_time: 550 Lock_time: 0 Rows_sent: 1 Rows_examined: 7024 use parformtest_development; SELECT SQL_CALC_FOUND_ROWS * FROM `t1s`;

調査方法(4) >EXPLAIN {調査したいSQL} ※SQLコマンドラインより実行 ※type, key, rowsに着目する  Type: 検索時のタイプ (ALLの場合、full scanが行われている)  Key: 使用されたindex-key  Rows: 検索時に走査された行数

INDEXによるチューニング(1) 効果が期待されるパターン ・EXPLAINによる実行計画でkeyがNULLとなっている場合 ・WHERE句に指定される検索キーである場合 メリット ・ソースを変更することなくチューニングが行える ・検索に対して効果が大きい デメリット ・INDEX対象テーブルへのINSERTのコストが増大する ⇒大量データのINSERT処理がある場合、要注意 ・INDEX領域を使うため容量が必要となる ・OPTIMIZEを実行しないとパフォーマンス劣化となる場合がある ⇒定期的な最適化バッチ等を考慮する必要がある

INDEXによるチューニング(2) How to --Migration-- def self.up create_table :t1s do |t| t.column :trans_no, :integer end add_index :t1s, :trans_no 注意) ※必ずEXPLAINでkeyにINDEXが使用されているか確認する ※JOINされるテーブルはPrimaryIndexが指定されている

include句によるチューニング(1) 効果が期待されるパターン ・has_many throughで結合、参照されている場合 メリット ・比較的に簡単なソース修正でチューニングが行える デメリット ・参照されないデータに対しても必ずJOINされる ・状況によっては不必要なデータを転送する可能性がある

include句によるチューニング(2) How to --Controller-- @t1s = T1.find( :all, :include => [:m1,:m2,:m3,:m4,:m5,:m6,:m7,:m8,:m9], :conditions => ["t1s.trans_no<?",10] )

抽出カラム絞込みによるチューニング(1) 効果が期待されるパターン ・必要なデータが全カラムに対して少ない場合 メリット ・DBからのデータ転送量を減らすことでコストが削減できる デメリット ・JOINしている場合、直接SQLを記述する必要がある(find_by_sql) ⇒Objectの階層が変わるため注意が必要 ・参照される可能性があるカラムの洗い出しが必要となる ・ソースコードの可読性が劣化する

抽出カラム絞込みによるチューニング(2) How to --Controller-- @t1s = T1.find_by_sql( ["SELECT `m01` FROM t1s LEFT OUTER JOIN m1s ON m1s.id=t1s.m1_id WHERE t1s.trans_no<?", 10] )

検証(1) 名称マスタを持つ大量トランザクションデータの検索を想定した. あえてデータ転送量を増やすため名称マスタの列数を大きくした. トランザクション T1 10カラム 65535件 マスタ M1 99カラム 9件 T1の各idカラムに紐付くマスタの値を参照した. T1.id1 ⇒ M1.m01 T1.id2 ⇒ M1.m02 T1.id3 ⇒ M1.m03 : T1.id9 ⇒ M1.m09

検証(2) ①INDEXによるチューニングによる検証 検索キー trans_noにindexを追加 チューニング前 >EXPLAIN SELECT * FROM t1s WHERE (t1s.trans_no<10) チューニング後

検証(3) ①INDEXによるチューニングによる検証 log結果(平均) ・チューニング前 Total 0.83ms Rendering:0.37ms DB:0.35ms ・チューニング後 Total 0.60ms Rendering:0.38ms DB:0.19ms

検証(4) ②include句チューニングによる検証 コントローラ修正 @t1s = T1.find( :all, :conditions => ["t1s.trans_no<?",10] ) ↓ :include => [:m1,:m2,:m3,:m4,:m5,:m6,:m7,:m8,:m9], チューニング前 Total 0.60ms Rendering:0.38ms DB:0.19ms チューニング後 Total 0.48ms Rendering:0.05ms DB:0.07ms

検証(5) ③抽出カラムの絞込みによるチューニング コントローラ修正 @t1s = T1.find( :all, :include => [:m1,:m2,:m3,:m4,:m5,:m6,:m7,:m8,:m9], :conditions => ["t1s.trans_no<?",10] ) ↓ @t1s = T1.find_by_sql(   [“SELECT `m01`・・・ FROM t1s LEFT OUTER JOIN m1s ON m1s.id=t1s.m1_id WHERE t1s.trans_no<?", 10] ※一部略記 チューニング前 Total 0.48ms Rendering:0.05ms DB:0.07ms チューニング後 Total 0.094ms Rendering:0.042ms DB:0.015ms

結果まとめ INDEXによるチューニングはDBアクセス部の効果が高い include句のチューニングはレンダリング部の効果が高い

チューニングの注意点 経験上、必要以上のチューニングはソースコードの可読性を落とします。 必要な場合のみに実施するようにしてください。 チューニング計画を立てる際は目標値を設定し、 様々な角度から調査を行いつつチューニングを行うようにしてください。

参考文献 パフォーマンスチューニングとは Ruby on Railsのパフォーマンス向上に関する10のtips http://www.atmarkit.co.jp/fjava/rensai3/devedge01/devedge01_1.html Ruby on Railsのパフォーマンス向上に関する10のtips http://blog.tkmr.org/tatsuya/show/268-ruby-on-rails-10-tips 【MySQLウォッチ】第8回 MySQLチューニングのテクニック http://itpro.nikkeibp.co.jp/members/ITPro/oss/20040624/146333/ mysqlチューニング Self-referential has_many :through associations http://blog.hasmanythrough.com/2006/4/21/self-referential-through

パフォーマンスチューニング on Rails おわり