|
1
|
|
|
2
|
- 目的・背景
- DOA+の普及を推進するにあたって
「正規化すれば、レスポンスが悪くなる」
という誤った認識が心理的な障害になっていることがわかった。
そこで正規形と非正規形のDBで検証実験を行い、正規化した方が高レスポンスを実現できることを確認することとした。
- 結論
- インデックスを適切に利用すれば、
正規化されたDBは非正規化されたDBより高速に動作する。
- 5000万件レベルのシステムであっても、正規化されたDBは
100万円程度のPCサーバーで高速レスポンスが実現できる。
|
|
3
|
- シナリオ
- 自動車の販売モデルで、以下の制約を想定
- 1つの受注で自動車1台を受注
- 1つ自動車(型番)に対して最大10個のオプションが選択可能
(オプション:カーナビ、アルミホイール等)
- 1つのオプションは最大10個の部品で構成される。
- 個々の部品は、最大5つの発注先を持つ
(今回の実験では、平均1つの発注先を設定)
- 在庫は持たず、受注の度に部品を手配する。
(部品は1個単位で手配できる)
- 備考:この実験は、非正規化のレスポンスを調査する
ものであり、シンプルなモデルにした。
|
|
4
|
|
|
5
|
|
|
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
|
- 受注明細 5,000万件から未手配データ 200件を抽出し、
受注ヘッダー20件を表示
|
|
12
|
|
|
13
|
|
|
14
|
|
|
15
|
- インデックスを用いた最善のアクセスパスが選択されるように以下のパフォーマンスチューニングを実施
- 正規形
- 受注ヘッダー、受注明細に完了フラグ(Null Key※1) を設定
(データ登録時に受注番号(NC)を書込み、手配完了時にNull値をセット)
- 該当項目と同時にSELECTする項目に複合Indexを作成
(Index Only※2検索とするため)
- INDEX は null 値を排除したB-Treeを使用
- 非正規形
- 未手配のデータを取得する為に、完了フラグ(手配済フラグ)を追加
(arrangef = Y:完了、N:未完了)
- 該当項目にインデックスを作成(Index検索とするため)
|
|
16
|
|
|
17
|
|
|
18
|
|
|
19
|
|
|
20
|
- 未手配の受注データから発注先毎、部品毎の手配数を集計
- 未手配オプションの件数:200件
- 未手配部品数(オプション数*10):2000件
|
|
21
|
|
|
22
|
|
|
23
|
|
|
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
|
|