列に 128MB のサイズの注釈を付けた場合、小規模および中規模のオブジェクトのために多くのスペースを浪費しているように感じます。使用できる可変長の BLOB タイプはありますか?
LOB (CLOB または BLOB) にはサイズがありません (ほとんどのデータベースで知る限り)。この型は、「通常の」データよりも明らかに大きい情報を保持するためのものです。ほとんどのデータベースは、そのようなデータに対して異なるストレージ スキームを使用します。たとえば、テーブルのメイン データとして別のセグメントに格納します。size
パラメータがHibernateによって考慮されているとは思わない。
休止状態は、スペースを無駄にすることなく、舞台裏でこれらすべてを処理してくれますか?
Hibernate は多くのことを行うことができず、LOB の効率的なストレージを管理するのはデータベースです。LOB は (特別なストレージのため) 他のタイプよりも少し遅くなりますが、それでもデータベースによって非常に適切に管理されます。
byte[] の長さはさまざまです (~10KB から ~100MB まで)。
これについて最善の方法は何ですか?
10KB は、行内の通常のデータ (数値や数文字など) のサイズに比べてすでに大きいです。
たとえば、短い文字列 (例: 20 文字) だけでなく非常に長い文字列 (例: 3000 文字) がある場合は、さらに問題になります。この場合、小さな文字列 (テーブルのメイン データに格納される可能性がある) に対して LOB の代償を払うことになります。しかし、とにかく 10KB は比較的大きいので、LOB の使用は本当に正当化されます。
ノート:
InputStream
バイト配列の代わりにストリーム (例: ) を使用することを検討してください。これにより、アプリケーションのパフォーマンスが向上する可能性があり、メモリに制約されることもありません (100MB の LOB にアクセスする同時ユーザーが 20 人いる場合はどうなるでしょうか?)。
LOB ストレージのチューニング方法を DBA に問い合わせることも検討してください。ほとんどのデータベースには、このためのパラメーターがあります。たとえば、Oracle LOB Performance Guidelineがあります。