特定のアプリケーションのパフォーマンスを向上させるために行われた非正規化についてよく耳にします。しかし、私は関連することを試みたことはありません。
ですから、正規化されたDBのどの場所がパフォーマンスを低下させるのか、つまり、非正規化の原則とは何ですか?
パフォーマンスを向上させる必要がある場合、この手法をどのように使用できますか?
特定のアプリケーションのパフォーマンスを向上させるために行われた非正規化についてよく耳にします。しかし、私は関連することを試みたことはありません。
ですから、正規化されたDBのどの場所がパフォーマンスを低下させるのか、つまり、非正規化の原則とは何ですか?
パフォーマンスを向上させる必要がある場合、この手法をどのように使用できますか?
通常、非正規化は次のいずれかに使用されます。
非正規化の基本的な考え方は、冗長なデータを追加するか、いくつかをグループ化して、それらのデータをより簡単に、より少ないコストで取得できるようにすることです。どちらがパフォーマンスに適しています。
簡単な例?
さて、いくつかのコストがあります。
非正規化は時空間のトレードオフです。正規化されたデータはスペースが少なくて済みますが、必要な結果セットを構築するために結合が必要になる場合があるため、時間がかかります。非正規化されている場合、データはいくつかの場所でレプリケートされます。その後、より多くのスペースが必要になりますが、データの目的のビューはすぐに利用できます。
次のような他の時空間最適化があります。
このようなアプローチの場合と同様に、データの読み取りは改善されますが (データはすぐに利用できるため)、データの更新にはコストがかかります (複製または事前計算されたデータを更新する必要があるため)。
「非正規化」という言葉は、設計上の問題の混乱につながります。非正規化によって高性能データベースを取得しようとすることは、ニューヨークから車で目的地にたどり着こうとするようなものです。進むべき道は教えてくれません。
必要なのは、たとえその設計が正規化の規則と衝突することがあっても、シンプルで健全な設計を生み出す優れた設計規律です。
そのような設計分野の 1 つがスター スキーマです。スター スキーマでは、1 つのファクト テーブルがスター オブ テーブルのハブとして機能します。他のテーブルはディメンション テーブルと呼ばれ、スキーマの縁にあります。ディメンションは、車輪のスポークのようなリレーションシップによってファクト テーブルに接続されます。スター スキーマは基本的に、多次元設計を SQL 実装に投影する方法です。
スター スキーマと密接に関連しているのは、もう少し複雑なスノーフレーク スキーマです。
優れたスター スキーマがあれば、2 つのディメンションと 1 つのファクト テーブルを含む 3 方向の結合のみで、膨大な種類のデータの組み合わせを取得できます。それだけでなく、多くの OLAP ツールがスター デザインを自動的に解読し、ポイント アンド クリック、ドリル ダウン、およびグラフィカルな分析アクセスを追加のプログラミングなしでデータに提供できます。
スター スキーマの設計は、第 2 正規形および第 3 正規形に違反することがありますが、レポートと抽出の速度と柔軟性が向上します。これは、データ ウェアハウス、データ マート、およびレポート データベースで最もよく使用されます。通常、スター スキーマやその他の検索指向の設計を使用すると、行き当たりばったりの「非正規化」よりもはるかに優れた結果が得られます。
非正規化における重要な問題は次のとおりです。
非正規化の最も簡単なタイプの 1 つは、結合を避けるために ID フィールドをテーブルに入力することです。ID は変更されてはならないため、データの同期を維持するという問題が発生することはめったにありません。たとえば、クライアントごとにクエリを実行する必要があることが多く、クライアント テーブルとクエリ対象のテーブルの間にあるテーブル内のデータをクエリで必ずしも必要としないため、クライアント ID をいくつかのテーブルに入力します。データが完全に正規化されている場合。クライアント名を取得するために 1 つの結合を実行する必要がありますが、クエリを実行しているテーブルの外部から必要な唯一のデータである場合、クライアント名を取得するために 6 つの親テーブルに結合するよりも優れています。
ただし、介在するテーブルのデータが必要なクエリを頻繁に実行しない限り、これには何のメリットもありません。
もう 1 つの一般的な非正規化は、名前フィールドを他のテーブルに追加することです。名前は本質的に変更可能であるため、名前がトリガーと同期していることを確認する必要があります。ただし、これにより 2 つではなく 5 つのテーブルに結合する手間が省ける場合は、挿入または更新が少し長くなるコストに見合うだけの価値があります。
レポートなどの特定の要件がある場合は、さまざまな方法でデータベースを非正規化するのに役立ちます。
特定のデータの重複を導入して、いくつかの JOIN を節約します (たとえば、特定の情報をテーブルに入力し、重複したデータで問題ないようにします。これにより、そのテーブル内のすべてのデータと、別のテーブルを結合して見つける必要がなくなります)。
データベースにクエリを実行するたびに、特定の値を事前に計算して、その場で計算する代わりに、テーブルの列に格納できます。もちろん、これらの計算された値は時間の経過とともに「古く」なる可能性があり、ある時点でそれらを再計算する必要があるかもしれませんが、通常、固定値を読み取るだけで何かを計算するよりも安価です (子行のカウントなど)。
パフォーマンスを向上させるためにデータベース スキーマを非正規化する方法は確かに他にもありますが、そうするとある程度の問題が発生することに注意する必要があります。これらの決定を行う際には、長所と短所 (パフォーマンス上の利点と自分自身が直面する問題) を慎重に比較検討する必要があります。
適切に正規化された親子関係を持つデータベースを考えてみましょう。
カーディナリティが平均 2x1 であるとしましょう。
p行の親という 2 つのテーブルがあります。2x p行の子。
結合操作は、p親行、2x p子行を読み取る必要があることを意味します。読み取られる行の総数はp + 2x pです。
これを、子行 2x pのみを持つ単一のテーブルに非正規化することを検討してください。読み取られる行数は 2x pです。
行が少ない == 物理 I/O が少ない == 高速。
この記事の最後のセクションによると、
https://technet.microsoft.com/en-us/library/aa224786%28v=sql.80%29.aspx
より単純な SQL クエリをより高速に実行するために非正規化されたデータを含むビューを作成する仮想非正規化を使用できますが、基礎となるテーブルは追加/更新操作を高速化するために正規化されたままになりますリアルタイムよりも)。私は自分でリレーショナル データベースのクラスを取っているところですが、これまで読んできた限りでは、このアプローチは理にかなっているように思えます。
正規化に対する非正規化の利点
基本的に非正規化は、RDBMS ではなく DBMS に使用されます。私たちが知っているように、RDBMS は正規化を使用して動作します。つまり、データが何度も繰り返されることはありません。ただし、外部キーを使用すると、一部のデータが繰り返されます。
DBMS を使用する場合、正規化を削除する必要があります。そのためには、繰り返しが必要です。それでも、テーブル間に関係がなく、各テーブルは分割できない存在であるため、パフォーマンスは向上します。