6

SQL開発者でBLOBデータを挿入しようとしました。しかし、実際に BLOB データを挿入するために使用される挿入ステートメントが見つかりません。

それとは別に、データベースの速度は本当に遅いです。小さなファイルの場合、問題なく実行されます。しかし、50 MB の avi ファイルを BLOB にインポートしようとすると、3 ~ 4 分かかり、まだ完了していません。BLOB データをファイルにエクスポートしようとすると、エクスポート プロセスも遅くなりました。Oracle 10g Express Edition を使用していました。データベースの速度がファイル システムの速度よりも遅い場合、なぜデータベースが BLOB データの格納に使用されるのでしょうか? パフォーマンスを最適化する他の方法はありますか?

4

2 に答える 2

5

まず第一に、BLOB をデータベースに保存すると (場合によっては少し、しばしば大幅に) 遅くなることが予想されますが、ファイル システムに保存するよりも確実に速くはありません。それらをDBに保存する理由は、パフォーマンスではなく、たとえば次のようなものです。

  • クラスター化または負荷分散されたシナリオで (共有) ファイル システムを使用できない
  • バックアップの容易さ: 1 つのプロセス、ファイルと DB を使用する場合は 2 つのプロセス
  • トランザクションの安全性: BLOB はそこにあり、完全であるかどうかのいずれかですが、中途半端な段階ではありません
  • 他には今思いつかない。

一般的な経験則として、これらのいずれにも関係がない場合は、ファイルを ... ファイルとして保存する必要があります。メタデータとパス名を DB に保存することは、私見では適切で一般的な方法です。

Oracle のチューニングについて: それについて書かれた本があります。枯れ木のペーパーバック形式でそれらを合計すると、1トンをはるかに超えると思われます。まず最初に、Oracle プロセスのメモリ消費量を見てみましょう - 経験則: 1 ギガ未満で BLOB を使用している場合、問題が発生しています。さまざまなメモリプールとそれらを増やす方法を読んでください。Express Edition にはいくつかの制限が適用される場合があります。

于 2012-08-31T17:19:13.587 に答える
1

これは、SQL 開発者で使用できるコードではありません。blob を INSERT するために StringBuffer を使用する Java コードです。それが役に立つことを願っています:

private void addBlob(oracle.jdbc.OracleConnection oracleConn, StringBuffer content) throws Exception
{    
      PreparedStatement st = null;
      try {                
            oracle.sql.BLOB blob = oracle.sql.BLOB.createTemporary(oracleConn, true, oracle.sql.BLOB.DURATION_SESSION);

            blob.setBytes(1, content.toString().getBytes("UTF-8"));

            st = oracleConn.prepareStatement("INSERT INTO MYTABLE (id, content) VALUES (MYTABLE_S.NEXTVAL, ?)");
            st.setBlob(1, blob);
            st.execute();
            st.close();
        }
        catch (Exception e) {
            utils.writeLog("Blob insertion Failed", e, utils.ERR);
            throw e;
        }        
        finally{
            st.close();
        }
  }
于 2012-08-31T18:40:54.283 に答える