ノート
スライド ショー
アウトライン
1
正規化と非正規化の
応答速度実証実験
2
概 要
  • 目的・背景
    • DOA+の普及を推進するにあたって

      「正規化すれば、レスポンスが悪くなる」

      という誤った認識が心理的な障害になっていることがわかった。
      そこで正規形と非正規形のDBで検証実験を行い、正規化した方が高レスポンスを実現できることを確認することとした。


  • 結論
    • インデックスを適切に利用すれば、
      正規化されたDBは非正規化されたDBより高速に動作する。
    • 5000万件レベルのシステムであっても、正規化されたDBは
      100万円程度のPCサーバーで高速レスポンスが実現できる。
3
実験方法
  • シナリオ
    • 自動車の販売モデルで、以下の制約を想定
      • 1つの受注で自動車1台を受注
      • 1つ自動車(型番)に対して最大10個のオプションが選択可能
        (オプション:カーナビ、アルミホイール等)
      • 1つのオプションは最大10個の部品で構成される。
      • 個々の部品は、最大5つの発注先を持つ
        (今回の実験では、平均1つの発注先を設定)
      • 在庫は持たず、受注の度に部品を手配する。
        (部品は1個単位で手配できる)


    • 備考:この実験は、非正規化のレスポンスを調査する
         ものであり、シンプルなモデルにした。
4
測定対象モデル(正規形)
5
データモデル(T字形ER)
6
測定対象モデル(非正規形)
7
(参考)測定対象モデル−正規形・物理
8
(参考) 測定対象モデル−非正規形・物理
9
測定環境
  • ハードウエア
    • CPU: Intel XEON 3.6GHz * 2 (EMT64T)
    • MEM: 7GB
    • DISK: 300GB(10Krpm) * 5 (RAID 5)


  • ソフトウエア
    • OS: Linux (Kernel 2.6 / x86_64)
    • DB: PostgreSQL 8.0.3
    • JDK: SUN JDK 1.5.0_05 (64bit)
    • Tomcat: 5.5.12
    • 開発環境: 楽々Framework II V2.1 (Prepared Statement使用)


  • データ容量
    • データ件数: 合計1億件以上
    • 物理データ容量: 35,564,377KB


  • 備考
    • Oracleを使用するとパフォーマンス実験の結果を公表できないため
      オープンソースソフトウエアであるPostgreSQL を利用した。
10
測定方法
  • 応答時間の測定は以下の方法で行った
    • JDBCを使用し、SQLを発行してから
      ResultSetが返ってくるまでの時間を ms 単位で計測
    • 発行するSQLは、Prepared Statement を使用
    • 測定は4回行い、最後3回の中央値を利用
11
実験1.未手配一覧の取得
  • 受注明細 5,000万件から未手配データ 200件を抽出し、
    受注ヘッダー20件を表示
12
(参考)未手配検索時参照モデル−正規形−
13
(参考)未手配検索時参照モデル−非正規形−
14
1.1 INDEX なしでの検索結果
15
1.2 チューニング
  • インデックスを用いた最善のアクセスパスが選択されるように以下のパフォーマンスチューニングを実施
  • 正規形
      • 受注ヘッダー、受注明細に完了フラグ(Null Key※1) を設定
        (データ登録時に受注番号(NC)を書込み、手配完了時にNull値をセット)
      • 該当項目と同時にSELECTする項目に複合Indexを作成
        (Index Only※2検索とするため)
      • INDEX は null 値を排除したB-Treeを使用


  • 非正規形
      • 未手配のデータを取得する為に、完了フラグ(手配済フラグ)を追加
        (arrangef = Y:完了、N:未完了)
      • 該当項目にインデックスを作成(Index検索とするため)
16
1.2 作成したINDEX
17
1.2 INDEX を使った検索結果
18
実験2:受注データ明細表示
  • 未手配受注一覧からデータを1件明細表示させます。
19
実験2:測定結果
20
実験3:手配数集計
  • 未手配の受注データから発注先毎、部品毎の手配数を集計
    • 未手配オプションの件数:200件
    • 未手配部品数(オプション数*10):2000件
21
(参考)手配数集計時参照モデル−正規形−
22
実験3:測定結果
23
実験3:手配数集計(非正規形)
24
まとめ
  • 正規化されたDBは高速に動作する。
    • Index を適切に利用することで正規化されたDBは
      非正規化されたDBよりも高速に動作する。


  • 非正規化されたDBは JOINすると非常に遅くなる。
    • 非正規形のDBを使っている技術者はJOINが遅くなることを体験しており、
      「正規化するともっと遅くなる」と誤解する可能性が高い。
25
補足説明
  • Null Key (T字形ER手法)
    • NULL値をINDEXのインスタンスから排除する仕様のRDBMSを使用すれば、大量データからターゲットとなる少量データを高速に抽出することができる。このテクニックをNULL KEYと呼ぶ。(佐藤正美氏提唱)


    • 利用可能な RDBMS: Oracle や PostgreSQL(部分INDEX)等
    • 利用できないRDMBS: IBM DB2等


  • INDEX ONLY
    • SELECT 文の対象項目が全て含まれる複合INDEXを作成することで、DBのデータファイルにアクセスすることなく、INDEXのみのリードで高速に検索結果を返す一般的な技術。


26
The END