私はEAVシステムを実装しようとしているチームと協力しています。彼らは、属性値テーブルをタイプごとに分割することを決定し、varcharのさまざまなサイズ範囲に対してさまざまなテーブルを使用して議論しています。
例:
varcharは必要なサイズしか使用しないという印象を常に受けていました。
これによってパフォーマンスが向上するかどうか、また必要となる追加のコーディング/ロジックの価値があるかどうかを知っていますか?
私の直感によると、分離を強制し、アプリケーションロジックで複数のルックアップを実行する必要があるために、パフォーマンスが向上しても、余分な手間(およびバグの可能性)に見合う価値はないでしょう。
小さな値がたくさんあり、onlyクエリを実行し、none残りの部分では、各ページに収まる行が増えるため、パフォーマンスが向上するため、RAMで処理するか、特定のクエリに対してディスクから読み取る必要があるページが全体的に少なくなります。すべてのプロパティを一度に(または単に組み合わせて)必要とします。この利点は、複数のテーブルを個別にクエリするか、UNIONを介してクエリする必要があるため、水から吹き飛ばされます。
もちろん、確実にする唯一の方法は、適度に現実的な大規模なデータセットを作成し、検討している配置に対していくつかのパフォーマンステストを実行することです。しかし、私はあなたが余分な複雑さに値する変更を見るだろうと非常に疑っています。データをより論理的な方法(つまり、ビジネスロジックによって暗示される方法)で分割できる場合、特にパーティションを異なるドライブに分割できる場合は、データのパーティション化を検討することをお勧めします。複雑になる可能性のある最適化(パーティショニングを含む)を検討している場合は、常に戻って全体的なデータ構造を再検討し、ビジネスロジックに対して機能していないことを確認し、ハードウェアが期待する負荷に対して十分であることを確認してください。代わりに、これらのコア領域を調べることで、はるかに大きな利益が得られる可能性が高いことが保証されています。
パフォーマンスはまったく向上しません。
簡単な考え、完全な分析ではありません:
EAVアンチパターン を探してください:EAVを回避する方法に関するいくつかの記事があります
ルックアップ用にEAVを最適化しようとしているようです。ただし、これは明らかに、プロファイルされた欠陥に対してシステムを最適化しようとしているのではなく、ブードゥーの推測によって最適化しようとしているように聞こえます。
最適化の最初のルールはプロファイリングであることを彼らに思い出させてください。DavidSpillettが言ったように、EAVに数億行になるまで(私が知っているほとんどのエンティティは少なくとも15の属性であるため、数千万のエンティティ)そしてプロファイルを作成すると、これが影響を与えるかどうかはわかりません。
「いいえ、これは彼らが思っているほどのメリットはありません」と言います。より適切なパーティション分割は、おそらく10文字と500文字ではなく、50文字と100文字のオーダーになるでしょう。しかし、それは単なる推測です。
ただし、インデックスのパフォーマンスが向上するという点で、彼らが望む効果があることに注意してください(一般的な経験則として、すべてのデータのパーティション化により、非パーティション化よりもインデックスのパフォーマンスが向上するはずです)。