varchar(50)
そしてvarchar(128)
、すべての観点からほぼ同じように動作します。ストレージサイズは、50文字未満の値でも同じです。これらは、型変換の問題なしで交換可能に結合(varchar(50)
結合varchar(128)
)できます(つまり、インデックスは結合内varchar(50)
の列を検索できますvarchar(128)
)。同じことがWHERE述語にも当てはまります。SQL Server 2012より前では、varchar
列のサイズを大きくすることは非常に高速なメタデータのみの操作でしたが、SQL Server 2012以降では、この操作は、説明されているものと同様に、特定の条件下ではデータの更新ごとに遅いサイズになる可能性があります。 null許容列を追加すると、テーブル全体が更新される可能性があります。
列の長さを変更すると、いくつかの問題が発生する可能性があります。
- 予期しないサイズ値の処理によるアプリケーションの問題。ネイティブのものは、不適切にコード化された場合、バッファサイズの問題に遭遇する可能性があります(つまり、サイズが大きいとバッファオーバーフローが発生する可能性があります)。管理対象アプリで深刻な問題が発生する可能性は低いですが、画面やレポートの列幅に値が収まらないなどの小さな問題が発生する可能性があります。
- 挿入または更新時に値を切り捨てることによるT-SQLエラー
- T-SQLのサイレント切り捨てが発生し、誤った値が生成されます(たとえば、ストアドプロシージャで宣言された@variables
varchar(50)
)
- 最大行サイズや最大インデックスサイズなどの制限に達する可能性があります。例えば。現在、タイプが8列の複合インデックスがあり、最大インデックスサイズの900を超えて、警告がトリガーされます
varchar(50)
。varchar(128)
メモリ付与の増加に関するマーティンの警告は、非常に有効な懸念事項です。それが実際に問題になる場合は、RAMを追加購入するだけです。