7-5 テーブル分割
テーブル分割はパフォーマンス向上を目的として実施されることが多い
テーブル分割には種類があり、許される方法と許されない方法がある
テーブル分割の種類
1️⃣ 水平分割
2️⃣ 垂直分割
(3️⃣ 集約)
水平分割とはレコード単位でテーブルを分割する手法
例
売り上げを年度ごとのテーブルにする
table:売り上げ
年度 会社コード 売り上げ(億円)
2001 C0001 50
2001 C0002 30
...... ...... ......
2002 C0001 60
2002 C0002 35
...... ...... ......
⬇️
table:売り上げ(2001)
年度 会社コード 売り上げ(億円)
2001 C0001 50
2001 C0002 30
...... ...... ......
table:売り上げ(2002)
年度 会社コード 売り上げ(億円)
2002 C0001 60
2002 C0002 35
...... ...... ......
SQL文パフォーマンス悪化の最大原因は、I/Oコストの増大なのでアクセスするデータ量を減らすことで、パフォーマンス改善に繋がる
しかし重大な欠点があるため、リレーショナルデータベースでは禁止されている
欠点1️⃣ 分割する意味的な理由がない
テーブル分割の全パターンに該当することでもあるが、正規化の理論からはテーブル分割は出てこない
欠点2️⃣ 拡張性に乏しい
何かしらの前提をもとにテーブル分割がされるので、その前提が崩れるとテーブル分割したことが返って裏目にでる
テーブルが次々に増えていくので、その度にプログラムも改修する必要がある
欠点3️⃣ 他の代替手段がある
水平分割を回避しつつ、パフォーマンス改善もできる
垂直分割とは列単位でテーブルを分割する手法
例
常にアクセスする列(会社コード, 社員ID, 年齢)だけのテーブルにする
table:社員
会社コード 社員ID 社員名 年齢 部署コード
C0001 000A 加藤 40 D01
C0001 000B 左藤 30 D02
C0002 0001 本田 45 D02
C0002 0002 斉藤 35 D01
⬇️
table:社員1
会社コード 社員ID 年齢
C0001 000A 40
C0001 000B 30
C0002 0001 45
C0002 0002 35
table:社員2
会社コード 社員ID 社員名 部署コード
C0001 000A 加藤 D01
C0001 000B 左藤 D02
C0002 0001 本田 D02
C0002 0002 斉藤 D01
正規化の理論から出てくるものでないが、無損失分解のためSQL結合によって復元できる ただし水平分分割同様に、分割する意味的な理由がない&他の代替手段がある
集約
テーブル分割ではなく、テーブル分割の代替え手段であり、その手段は2種類ある
1️⃣ 列の絞り込み
とあるテーブルでアクセス頻度が高い列だけを別テーブルとして新規作成する
例
table:社員
会社コード 社員ID 社員名 年齢 部署コード
C0001 000A 加藤 40 D01
C0001 000B 左藤 30 D02
C0002 0001 本田 45 D02
C0002 0002 斉藤 35 D01
↕️
table:社員(年齢)
会社コード 社員ID 年齢
C0001 000A 40
C0001 000B 30
C0002 0001 45
C0002 0002 35
新規作成したテーブルのことを、一般的にはデータマートあるいはマートという 垂直分割の代替え手段
メリット
オリジナルのテーブルに変更を加えなくて済む
検索パフォーマンスが向上する
デメリット
オリジナルテーブルと集約テーブルに不整合が起きやすい
不整合を避けるために同期頻度を上げると更新処理に負荷がかかる
一般的には1日数回程度のバッチ更新なので、要件と照らし合わせて不整合が起きないことを保証する必要がある
2️⃣ サマリテーブル
集約関数によってレコードが集約された状態になっているテーブル
例
table:社員
会社コード 社員ID 社員名 年齢 部署コード
C0001 000A 加藤 40 D01
C0001 000B 左藤 30 D02
C0002 0001 本田 45 D02
C0002 0002 斉藤 35 D01
↕️
table:社員平均年齢
会社コード 平均年齢
C0001 40
C0002 30
メリット・デメリットはデータマートと同じ