分割 (データベース)
データベースの分割(ぶんかつ、英: Partitioning)は、データベースを複数の部分に分割することである。
この分割は管理しやすさ、性能、可用性などの向上を理由として行われるのが一般的である。パーティション化とも呼ばれ、分割された各部分をパーティションと呼ぶ。
概要
編集最もよくあるものは、分散データベースでの分割である。各パーティションは複数のノードに分散配置され、ユーザーはそれぞれのノードでローカルにトランザクションを実施できる。これは、可用性とセキュリティを保持しつつ、特定ビューに関わる普通のトランザクションの性能を向上させる。
データベースの分割は、それぞれが(表、インデックス、トランザクションログをそれぞれ保持した)小規模なデータベースとなるような分割方法と、1つのテーブルだけのように選択した要素だけを分割する方法がある。
- 水平分割 (horizontal partitioning)
- 1つのテーブルの各行を別々のテーブルに分散させることである。例えば、顧客データのテーブルを郵便番号に基づいて東日本と西日本に分け、CustomerEast と CustomerWest という2つのテーブルに分割する。テーブルは2つに分割されるが、全顧客を表すために両者を結合したビューを生成することになるかもしれない。
- 垂直分割 (vertical partitioning)
- テーブルの一部の列だけを抜き出す形で分割を行う。関係の正規化は本質的に垂直分割に関係するプロセスである。垂直分割には複数の記憶装置を使うこともあり、例えばあまり使われない列や非常に桁数の多い列を別のデバイスに置くなどが考えられる。明示的に行う場合も暗黙のうちに行う場合もあるが、この種の分割を "row splitting" とも呼ぶ。よくある垂直分割は、列の内容の利用頻度によって分割するものである。分割されたテーブル群を包含するビューを生成すると、元の場合よりも性能が低下するが、利用頻度の高いデータのみにアクセスする場合は性能が向上する。
分割基準
編集高機能なデータベース管理システムは、分割について各種基準(分割手法)を提供している。分割には分割キー (partitioning key) を使う。よくある分割基準としては、以下のものがある。
- 範囲分割 (range partitioning)
- 分割キーの値がある範囲内にあるかどうかで分割する。例えば、郵便番号を分割キーとして水平分割するような場合である。
- リスト分割 (list partitioning)
- 値の一覧にパーティションを割り当て、分割キーの値をその一覧に照らしてパーティションを選択する。例えば、
Country
というカラムの値がIceland
、Norway
、Sweden
、Finland
、Denmark
のどれかになっている行を抜き出すと北欧諸国のパーティションを構築できる。 - ハッシュ分割 (hash partitioning)
- ハッシュ関数の値によってパーティションに含めるかどうかを決定する。例えば、4つのパーティションに分割する場合、ハッシュ関数は 0 から 3 の整数を返す。
合成分割 (composite partitioning) は上記手法を組み合わせることを意味し、例えばまず範囲分割しておいて、その後にハッシュ分割するといったことが考えられる。コンシステントハッシュ法は、ハッシュ分割とリスト分割の合成と見なすことができ、キー空間をハッシュで縮小することで一覧できるようにする。