derby で BLOB を削除する際にパフォーマンスの問題が発生しており、誰かアドバイスを提供できるかどうか疑問に思っていました。
これは主に Windows と Solaris で 10.4.2.0 を使用した場合ですが、新しい 10.5.1.1 リリース候補 (多くの LOB の変更があるため) でもテストしましたが、大きな違いはありません。
問題は、多くの大きな BLOB を含むテーブルでは、1 つの行を削除するのに長い時間がかかる (多くの場合 1 分以上) ことです。
テーブルを作成し、サイズの異なるブロブを含むいくつかの行を挿入してから削除する小さなテストでこれを再現しました。
テーブル スキーマは単純です。
テーブル blobtest を作成します (デフォルトで ID として生成された ID 整数、b blob )
次に、1024 バイト、1Mb、10Mb、25Mb、50Mb、75Mb、100Mb のブロブ サイズで 7 行を作成しました。
ブロブが正しく作成され、正しいサイズであることを確認するために、ブロブを読み返しました。
その後、SQL ステートメントを使用して削除されています (「delete from blobtest where id = X」)。
作成した順序で行を削除すると、1 つの行を削除する平均的なタイミングは次のようになります。
1024 バイト: 19.5 秒
1Mb: 16秒
10Mb: 18秒
25Mb: 15秒
50Mb:17秒
75Mb: 10秒
100Mb:1.5秒
それらを逆の順序で削除すると、1 つの行を削除する平均タイミングは次のようになります。
100Mb:20秒
75Mb: 10秒
50Mb:4秒
25Mb:0.3秒
10Mb: 0.25秒
1Mb: 0.02秒
1024 バイト: 0.005 秒
7 つの小さなブロブを作成すると、削除時間はすべて瞬時になります。
したがって、削除時間は、削除される BLOB のサイズよりも、テーブル内の行の全体的なサイズに関連しているように見えます。
テストを数回実行しましたが、結果は再現可能のようです。
それで、誰かがパフォーマンスについて説明し、それを回避または修正する方法について何か提案はありますか? 実稼働環境で大きな BLOB を使用することは非常に問題になります…</p>