サイズに基づいてVarchar値を分離すると、パフォーマンスが向上しますか?
-
16-10-2019 - |
質問
私は、EAVシステムを実装しようとしているチームと協力しています。彼らは、属性値テーブルをタイプごとに分割することを決定し、Varcharの異なるサイズ範囲に対して異なるテーブルを使用して議論しています。
元:
- Table_1 -Varchar(10)まで
- テーブル_2 -varchar(11)からvarchar(500)
- Table_3-varchar(501)からVarchar(最大)へ
私はいつもその印象を受けています varchar 必要なサイズのみを使用する予定でした。
これがパフォーマンスに何らかの利益を得るかどうか、そしてそれが必要になる追加のコーディング /ロジックの価値があるでしょうか?
解決
私のガットは、あなたが得るパフォーマンスの利益は、分離を実施し、アプリケーションロジックで複数のルックアップを実行する必要があることから生じる余分な手間(およびバグの可能性)に値する可能性は低いと言います。
あなたがたくさんの値を持っていて、 それだけ それらを照会します 無し 残りのうち、各ページに多くの行が適合するため、パフォーマンスが増えることがわかります。そのため、全体でLAMで処理するか、特定のクエリのディスクから読み取る必要があります。一度にすべてのプロパティを必要とするとすぐに(または単なるミックス)、この利点は、複数のテーブルを個別にまたは組合を介して照会する必要があることにより、水から吹き飛ばされます。
もちろん、かなり現実的な大きなデータセットをリグアップし、検討しているアレンジメントに対していくつかのパフォーマンステストを実行することです。しかし、私はあなたが余分な複雑さの価値がある変化を見ることを非常に疑っています。データをより論理的な方法で分割できる場合(つまり、ビジネスロジックで暗示される方法)、特に異なるドライブでパーティションを分割できる場合は、データパーティションを調べることをお勧めします。潜在的に複雑に満ちた最適化(パーティションを含む)を熟考していることに気付いたときはいつでも、常に戻ってデータ構造全体を再検討し、ビジネスロジックに対して機能していないことを確認し、ハードウェアで十分であることを確認してください。代わりに、これらのコア領域を調べることにより、はるかに重要な利益を見つける可能性が高いことを保証します。
他のヒント
パフォーマンスがまったく利益を得ることができません。
迅速な考え、徹底的な分析ではありません:
- ある時点で、1つのビューを取得するにはこれらを結合する必要があり、すべてがVarchar(最大)になります
- 前に長さをどのように決定しますか?
- 検索値のインデックス付け? > 900バイトをインデックスすることはできません
- EAVで独自の「ユニークな」制約を転がすことは、複数のテーブルに分割することなく、十分に悪いでしょう
探す EAVアンチパターン: :EAVを回避する方法に関するいくつかの記事があります
彼らはLookupsのためにEAVを最適化しようとしているようです。ただし、これは明らかに、プロファイルされた欠陥のためにシステムを最適化しようとしていないように聞こえますが、代わりにVoodooの推測を介して最適化しようとしています。
David Spillettが言ったように、最適化の最初のルールはプロファイリングであることを彼らに思い出させてください、あなたがEAVに数億行を持っているまで(私が知っているほとんどのエンティティが少なくとも15の属性であると考えると、あなたは数千万人のエンティティ)そしてプロファイルこれが影響を与えることを知ることはできません。
私は「いいえ、これは彼らがそれを考えるように利益を得ることはありません」と、そしてより良いパーティション化はおそらく10と500ではなく50枚のcharと100枚のchar程度のものになるでしょう。しかし、それは単なる推測です。
しかし、それがより良いインデックスパフォーマンスを可能にするという点で彼らが望む効果があることに注意してください(すべてのデータパーティション化は、一般的な経験則として非パーティションよりもより良いインデックス作成パフォーマンスを提供するはずです)