物理モデルのクエリー パフォーマンスの最適化(物理モデルの非正規化)

提供: ER/Studio Data Architect
移動先: 案内検索

物理モデルの作成 への移動

論理設計では的確なモデルであっても、実際の動作に必要なクエリーが複雑であったり処理に時間がかかったりするために、実装段階でその設計が機能しないことがよくあります。場合によっては、論理設計から離れて検討し直すことが、パフォーマンス問題を解決するための最善策となります。非正規化を実行する一番の理由は、おそらく論理設計と物理設計を分離することでしょう。そうすれば、現実のパフォーマンス問題に対処するために論理設計を妥協する必要がないからです。

物理設計を非正規化する際に検討する一般的な事柄を次に示します。

  • 非キー カラムの重複: 他のテーブルに含まれる非キー カラムを重複して配置すると、クエリーの実行時にそのテーブルへのアクセスや結合を不要にすることができます。たとえば、参照先テーブルの "説明" カラムや "名前" カラムを重複して配置しておきます。テーブルで非キー カラムを重複させた場合、参照先テーブルの値との間で不整合が起こらないように、カラム データを同期させる手続きが必要になります。
  • テーブルの横分割: テーブルに多数のデータ行が含まれる場合、複数のテーブルに分割してデータを分けることができます。各テーブルには同じスキーマが使用されますが、異なる範囲の主キー値が格納されます。テーブルを横分割すると、データ取得に使用されるインデックスのサイズと密度を削減でき、検索効率が向上します。その一方で、複数のテーブル上にあるデータにアクセスする必要が生じるため、テーブルを管理するための手続きが複雑化します。
  • テーブルの縦分割: 多数のカラムを含むテーブルで読み取り/書き込み操作が頻繁に実行される場合、複数のテーブルに分割して、それぞれに異なるカラム セットを含めることができます。各カラム セットでは同一の主キーが使用されます。更新処理を複数のテーブルに分散できるため、複数のインデックスを管理するための負担を軽減できます。テーブルの横分割と同様に、テーブルの縦分割でも、複数のテーブルを管理するための手続きが複雑化します。

論理モデルから物理モデルを生成した後に、非正規化マッピングを実行して、物理モデル実装のパフォーマンスを向上させることができます。

物理モデルを手動で編集する場合とは異なり、非正規化マッピングでは変更内容が記録され、論理モデルへのリンクが保持されます(テーブル エディタの[論物関連]タブに表示されます)。このように、非正規化の内容は自動的に文書化されるため、更新された論理モデルとマージする際の手作業を減らすことができます。また、マッピングはいつでも取り消すことができます(「物理モデルと論理モデルのシンクロ」を参照)。

次の非正規化マッピングを実行できます。

  • 親テーブルに統合: 1 つ以上の不要な子テーブルを除去し、それらのテーブルのカラムを親テーブルに統合します。
  • 子テーブルに統合: 不要な親テーブルを除去し、親テーブルのすべての非キー カラムを対応する 1 つ以上の子テーブルにコピーします。テーブル マージを実行して、それらの子テーブルをさらに統合することもできます。
  • 横分割: テーブルを、同一カラムを含む 2 つ以上のテーブルに分割します。
  • 縦分割: 元のテーブルを除去し、元のテーブルのカラムを 2 つ以上の新規テーブルに分配します。新規テーブルには、除去された元テーブルと同じ主キーが含まれています。その他の各カラムは、新規テーブルの 1 つ、複数、またはすべてに含めるか、あるいは 1 つも含めないよう設定できます。
  • カラムのコピー: テーブル間でカラムをコピーすると結合が不要になり、クエリーのパフォーマンスが向上します。
  • テーブル マージ: 関連性のない 2 つ以上のテ-ブルに同じ主キーがある場合、両テーブルのカラムを含む 1 つのテーブルに統合して、不要なテーブルを除去します。

子カラムを除去して親テーブルに統合

このセクションには次のトピックが含まれています。

親テーブルに統合

非正規化マッピングの[親テーブルに統合]を実行すると、物理モデルから 1 つ以上の不要な子テーブルが除去されて、子テーブルのカラムが親テーブルに統合されます。子テーブルを親テーブルに統合すると、親の主キーが保持されます。子のネイティブ主キー カラムはすべて破棄されます。

次の例では、[SALES_ORDER_LINE]テーブルが[SALES_ORDER]テーブルに統合されます。[SALES_ORDER_LINE]テーブルのすべてのカラムは[SALES_ORDER]テーブルに取り込まれ、親のキーのみが保持されます。

ERStudio-114.gif

親テーブルに統合マッピングを新規作成

  1. 物理モデルを表示します。
  2. クリックしたままドラッグして範囲選択するか、または Ctrl キーを押しながらクリックして、親テーブルと子テーブルを選択します。
  3. 選択したテーブルのいずれかを右クリックして、ショートカット メニューの[非正規化マッピング|親テーブルに統合] を選択します。
  4. [親テーブルに統合ウィザード]のステップを完了します。

Notepad blue icon 2.pngメモ:

  • [サブタイプ間のリレーションシップを再帰リレーションシップに変換]チェック ボックスをオンにすると、サブタイプをスーパー タイプに統合するときに、サブタイプ間のリレーションシップが保持されます。リレーションシップは、再帰型になります。マッピングの実行前にサブタイプで設定されていたロール名は、スーパータイプで使用されます。このオプションが表示されない場合、ステップ 1 は情報を参照するだけの画面になります。正しいテーブルが一覧表示された場合は、[次へ]をクリックします。正しくない場合は、[キャンセル]をクリックしてテーブルを再選択します。
  • [親テーブルに統合]メニュー項目がグレーアウトしている場合は、間違って別のテーブルや他のオブジェクトを選択していないかを確認してください。
  • 操作が正しく行われると、統合されたテーブルに繰り返しカラム(子カラム)が指定した数だけ追加されます。たとえば、親と子のリレーションシップで 1:12 のカーディナリティを用いて月ごとに固有のデータを正規化している場合、親テーブルに統合ウィザードを実行すると、デフォルトで、子テーブルのカラムが 12 回繰り返して統合テーブルに追加されます。繰り返しカラムの名前は、元のカラム名に数字の接尾語を追加したものになるため、マッピングの作成後に、適切な名前に変更する必要があります。


不要な親テーブルの除去

このセクションには次のトピックが含まれています。

子テーブルに統合

非正規化マッピングの[子テーブルに統合]を実行すると、不要な親テーブルが除去され、親テーブルのすべての非主キー カラムが 1 つ以上の子テーブルにコピーされます。次の例では、[SLS_ORDR]テーブルが子の[SLS_ORDR_LINE]テーブルに統合されています。子テーブルは、依存型リレーションシップによって親テーブルから移行される "SLS_ORDR_ID" カラムを複合キーとして保持します。親テーブルを子テーブルに統合すると、子の主キーが保持されます。子のネイティブな主キー カラムはすべて保持されます。

ERStudio-115.gif

子テーブルに統合マッピングを新規作成

  1. 物理モデルを表示します。
  2. クリックしたままドラッグして範囲選択するか、または Ctrl キーを押しながらクリックして、親テーブルと子テーブルを選択します。
  3. 選択したテーブルのいずれかを右クリックして、ショートカット メニューの[非正規化マッピング|子テーブルに統合]を選択します。
  4. [子テーブルに統合ウィザード]のステップを完了します。

Notepad blue icon 2.pngメモ:

  • [子テーブルに統合]メニューがグレーアウトしている場合は、間違って別のテーブルや他のオブジェクトを選択していないかを確認してください。
  • ウィザードのステップ1では、情報が表示されるだけです。正しいテーブルが一覧表示された場合は、[次へ]をクリックします。正しくない場合は、[キャンセル]をクリックしてテーブルを再選択します。
  • 正しい操作が行われた場合、非正規化された子テーブルは「テーブル マージ」で統合することもできます。

テーブルを分割してカラムを複製

このセクションには次のトピックが含まれています。

横分割

非正規化マッピングの[横分割]を実行すると、1 つのテーブルが同一のカラムを持つ 2 つ以上のテーブルに分割されます。次の例では、1 つの[discounts]テーブルが 3 つのテーブルに分割されます。


ERStudio-116.gif

横分割マッピングの新規作成

  1. 物理モデルを表示します。
  2. 分割するテーブルを右クリックして、ショートカット メニューの[非正規化マッピング|横分割]を選択します。
  3. [テーブルの横分割ウィザード]のステップを完了します。


テーブルを主キーを共有する新規テーブルでの置き換え

このセクションには次のトピックが含まれています。

縦分割

非正規化マッピングの[縦分割]を実行すると、元のテーブルが除去されて、2 つ以上の新規テーブルにカラムが分配されます。新規テーブルには、除去された元テーブルと同じ主キーが含まれています。その他の各カラムは、新規テーブルの 1 つ、複数、またはすべてに含めるか、あるいは 1 つも含めないよう設定できます。次の例では、5 年間の収益に対して各年のカラムを含むテーブルが、各年に対応した 5 つのテーブルに分割されています。

ERStudio-117.gif

縦分割マッピングの新規作成

  1. 物理モデルを表示します。
  2. 分割するテーブルを右クリックして、ショートカット メニューの[非正規化マッピング|縦分割]を選択します。
  3. [テーブルの縦分割ウィザード]のステップを完了します。
  4. カラムを分配するには、ステップ 3 で[利用可能なカラム]に表示されているカラムを Shift キーまたは Ctrl キーを押したままクリックして選択し、[対象テーブル]に表示されている新しいテーブルのいずれかに一括でドラッグします。[利用可能なカラム]のカラムは選択状態で保持されるので、必要があれば、同じカラム セットを別の新しいテーブルにドラッグすることができます。

カラムのコピーによる結合の不要化

このセクションには次のトピックが含まれています。

カラムのコピー

カラムのコピーを実行すると、テーブル間でカラムがコピーされます。結合が不要になるため、クエリーのパフォーマンスが向上します。次の例では、"pub_name" カラムが[titles]テーブルにコピーされ、本の出版社名を問い合わせる場合に結合が不要になります。

ERStudio-118.gif

カラムのコピーの新規作成

  1. モデル エクスプローラの[データ モデル]タブで、マップするカラムを右クリックして、ショートカット メニューの[カラムのコピー]をクリックします。
  2. [カラムのコピー ウィザード]のステップを完了します。
  3. ウィザードのステップ 1 では、情報が表示されるだけです。正しいカラムが一覧表示された場合は、[次へ]をクリックします。正しくない場合は、[キャンセル]をクリックして対象のカラムを再選択します。

不要なテーブルの除去

このセクションには次のトピックが含まれています。

テーブル マージ

[テーブル マージ]を実行すると、同じ主キーを持つ関連性のない 2 つ以上のテーブルを、全テーブルのカラムを含む 1 つのテーブルに統合して、不要なテーブルが除去されます。次の例では、[jobs]テーブルのすべてのカラムが[dbo.new_jobs]テーブルにマージされています。

ERStudio-119.gif


テーブル マージ マッピングの新規作成

  1. 物理モデルを表示します。
  2. クリックしたままドラッグして範囲選択するか、または Ctrl キーを押しながらクリックして、マージするテーブルを選択します。
  3. 択したテーブルのいずれかを右クリックして、ショートカット メニューの[非正規化マッピング|テーブル マージ] を選択します。
  4. [テーブル マージ ウィザード]のステップを完了します。

Notepad blue icon 2.pngメモ:

  • [テーブル マージ]メニューがグレーアウトしている場合は、間違って別のテーブルや他のオブジェクトを選択していないかを確認してください。
  • ウィザードのステップ 1 では、情報が表示されるだけです。正しいテーブルが一覧表示された場合は、[次へ]をクリックします。正しくない場合は、[キャンセル]をクリックしてテーブルを再選択します。

関連項目