varcharまたはvarbinaryに大きなMAX値を選択することの欠点
-
19-08-2019 - |
質問
varcharまたはvarbinary列を作成するときにmaxに大きな値を選択することの短所は何ですか?
私はMS SQLを使用していますが、これは他のデータベースにも関連すると思います。
ありがとう
解決
これは、特定の列に大量のデータを保存することが妥当かどうかによって異なります。
大量のデータを適切に格納しない列(つまり、従業員の名をVARCHAR(1000)として)を宣言すると、さまざまな問題が発生します
- ほとんどのクライアントAPI(つまり、ODBCドライバー、JDBCドライバーなど)は、特定の列の最大サイズを格納するのに十分な大きさのメモリバッファーをクライアントに割り当てます。そのため、データベースに実際のデータを保存するだけでよい場合でも、クライアントアプリケーションが使用するメモリ量を大幅に増やすことができます。
- テーブル定義からデータ検証ルールを駆動する(またはデータに関する情報を伝える)ことができなくなります。データベースが1000文字の名を許可する場合、データベースと対話するすべてのアプリケーションは、おそらく従業員名の大きさについて独自のルールを持つことになります。すべてのアプリケーションとテーブルの間にストアドプロシージャレイヤーを配置してもこれが緩和されない場合、通常、さまざまなルールを持つさまざまなアプリケーションにつながります。
- マーフィーの法則によれば、1000文字を許可すると、最終的に誰かが列に1000文字、または少なくとも1つ以上のアプリケーションでエラーを引き起こすのに十分な値を格納します(つまり、すべてのアプリケーションの従業員名フィールドには1000文字を表示できます)。
他のヒント
RDBMSに依存します。 IIRC、MySqlは、varchars <!> gt;に2バイトのオーバーヘッドを割り当てます。 255文字(varcharの長さを追跡するため)。 MSSQL <!> lt; = 2000では、行サイズ<!> gt;を割り当てることができます。 8060バイトですが、実際に8060バイトを超える行をINSERTまたはUPDATEしようとすると失敗します。 SQL 2005 [1]は挿入を許可しますが、オーバーフロー用に新しいページを割り当て、ポインターを残します。これは明らかにパフォーマンスに影響します。
[1] varchar(max)は特殊なケースですが、フィールドの長さが<!> gtの場合、オーバーフローページも割り当てます。 8000または行<!> gt; 8060。これはMSSQLのデフォルトであり、データ行オプションの大きなタイプによって動作が変わる可能性があります。
何らかの方法(外部インターフェイスなど)で大量のデータが入力され、アプリがそれを処理するように設計されていない場合、アプリケーションが破損するリスクが追加される可能性があります。
適切な設計として、フィールドのサイズは常に現実的な値に制限する必要があります。