oracle 下操作blob字段是否会产生大量redo

操作blob字段是否会产生大量redo,答案是不会。以下来做一个实验,測试数据库版本号是11.2.0.1.0:

--创建一张表做測试之用

create table test_blob

(

id number,

tupian blob

);

import java.io.FileInputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import oracle.sql.BLOB;

public class BlobExample {
    static final String driver_class  = "oracle.jdbc.driver.OracleDriver";
    static final String connectionURL = "jdbc:oracle:thin:@10.10.15.25:1521:orcl";
    static final String userID        = "test";
    static final String userPassword  = "test";

    private void insertTestBlob() {
        Connection conn=null;
        Statement stm=null;
        ResultSet rs=null;
        BLOB blob = null;
        FileInputStream fin=null;
        OutputStream out=null;
        try{
            conn = DriverManager.getConnection(connectionURL, userID, userPassword);
            stm = conn.createStatement();
            conn.setAutoCommit(false);
            String sql = "insert into test_blob values(1,EMPTY_BLOB())";
            stm.executeUpdate(sql);
            rs = stm.executeQuery("SELECT tupian FROM test_blob WHERE id=1 FOR UPDATE ");
           fin = new FileInputStream("d://20130317.jpg");
           byte[] blobBuf = new byte[(int)fin.available()];
           fin.read(blobBuf);
           fin.close();

           if(rs.next()) {
            blob = (oracle.sql.BLOB)rs.getBlob(1);
            out = blob.getBinaryOutputStream();
            out.write(blobBuf);
            out.close();
            conn.commit();
           }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try {
                rs.close();
                stm.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String args[]){
        BlobExample  blobClobExample = new BlobExample();
        blobClobExample.insertTestBlob();
    }
}

--做非常多次

insert into test_blob  select * from test_blob;

insert into test_blob  select * from test_blob;

insert into test_blob  select * from test_blob;

.......

commit;

--准备dump block

select rowid,

dbms_rowid.rowid_object(rowid) object_id,

dbms_rowid.rowid_relative_fno(rowid) file_id,

dbms_rowid.rowid_block_number(rowid) block_id,

dbms_rowid.rowid_row_number(rowid) num

from test_blob;

--update之前blob的状态

alter session set tracefile_identifier = ‘Look_For_Me‘;

alter system switch logfile;

alter system switch logfile;

alter system dump datafile 5 block 3274932;

--update之后blob的状态。同一时候測试一下。此时update产生了多少redo

select name, value

from v$mystat, v$statname

where v$mystat.statistic# = v$statname.statistic#

and v$statname.name = ‘redo size‘

update test_blob set tupian = null;

commit;

select name, value

from v$mystat, v$statname

where v$mystat.statistic# = v$statname.statistic#

and v$statname.name = ‘redo size‘

alter system switch logfile;

alter system switch logfile;

alter session set tracefile_identifier = ‘Look_For_Me1‘;

alter system dump datafile 5 block 3274932;

測试结果:我传的图片是5.1M,一共产生了350条数据,都把blob置为空以后,共产生了7.6M的redo,非常显然是blob的内容是没有产生redo的。

分析原理,得借助分析dump block的内容,能够看到设置blob字段为null后产生的redo仅仅是类似col  1: [84]这些信息。

blob设置为空曾经:

Block header dump:  0x0171f8b4

Object id on Block? Y

seg/obj: 0x17f1d  csc: 0x9a8.7256c728  itc: 2  flg: E  typ: 1 - DATA

brn: 0  bdba: 0x171f8b0 ver: 0x01 opc: 0

inc: 0  exflg: 0

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc

0x01   0x0003.01b.000033cf  0x00c001f5.132c.39  --U-    1  fsc 0x0000.7256c775

0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000

bdba: 0x0171f8b4

data_block_dump,data header at 0x2b35c4c56064

===============

tsiz: 0x1f98

hsiz: 0x14

pbl: 0x2b35c4c56064

76543210

flag=--------

ntab=1

nrow=1

frre=-1

fsbo=0x14

fseo=0x1f12

avsp=0x1f29

tosp=0x1f29

0xe:pti[0] nrow=1
offs=0

0x12:pri[0] offs=0x1f12

block_row_dump:

tab 0, row 0, @0x1f12

tl: 91 fb: --H-FL-- lb: 0x1  cc: 2

col  0: [ 2]  c1 02

col  1: [84]

00 54 00 01 01 0c 00 00 00 01 00 00 00 01 00 00 00 0e 48 41 00 40 05 00 00

00 02 76 12 a0 00 00 00 00 00 02 01 71 f8 bc 01 71 f8 bd 01 71 f8 be 01 71

f8 bf 01 71 f8 bb 01 ca 11 3d 01 ca 11 3e 01 ca 11 3f 01 ca 11 39 01 ca 11

3a 01 ca 11 3b 01 ca 11 3c

LOB

Locator:

Length:        84(84)

Version:        1

Byte Length:    1

LobID: 00.00.00.01.00.00.00.0e.48.41

Flags[ 0x01 0x0c 0x00 0x00 ]:

Type: BLOB

Storage: BasicFile

Enable Storage in Row

Characterset Format: IMPLICIT

Partitioned Table: No

Options: ReadWrite

Inode:

Size:     64

Flag:     0x05 [ Valid InodeInRow(ESIR) ]

Future:   0x00 (should be ‘0x00‘)

Blocks:   630

Bytes:    4768

Version:  00000.0000000002

DBA Array[12]:

0x0171f8bc 0x0171f8bd 0x0171f8be 0x0171f8bf

0x0171f8bb 0x01ca113d 0x01ca113e 0x01ca113f

0x01ca1139 0x01ca113a 0x01ca113b 0x01ca113c

............................................................

............................................................

End dump data blocks tsn: 6 file#: 5 minblk 3274932 maxblk 3274932

blob设置为空之后:

Block header dump:  0x0171f8b4

Object id on Block? Y

seg/obj: 0x17f1d  csc: 0x9a8.7256c99f  itc: 2  flg: E  typ: 1 - DATA

brn: 0  bdba: 0x171f8b0 ver: 0x01 opc: 0

inc: 0  exflg: 0

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc

0x01   0x0003.01b.000033cf  0x00c001f5.132c.39  C---    0  scn 0x09a8.7256c775

0x02   0x0001.003.0000315e  0x00c0218e.1348.3a  --U-    1  fsc 0x0052.7256c9a7

bdba: 0x0171f8b4

data_block_dump,data header at 0x2b7ad6cce464

===============

tsiz: 0x1f98

hsiz: 0x14

pbl: 0x2b7ad6cce464

76543210

flag=--------

ntab=1

nrow=1

frre=-1

fsbo=0x14

fseo=0x1f0c

avsp=0x1f29

tosp=0x1f7b

0xe:pti[0] nrow=1
offs=0

0x12:pri[0] offs=0x1f0c

block_row_dump:

tab 0, row 0, @0x1f0c

tl: 6 fb: --H-FL-- lb: 0x2  cc: 1

col  0: [ 2]  c1 02

............................................................

............................................................

End dump data blocks tsn: 6 file#: 5 minblk 3274932 maxblk 3274932

时间: 2024-10-13 09:24:18

oracle 下操作blob字段是否会产生大量redo的相关文章

oracle 在操作blob该字段是否会产生很多redo

操作blob该字段是否会产生很多redo,答案是否定的.以下来做一个实验,測试数据库版本号是11.2.0.1.0: --创建一张表做測试之用 create table test_blob ( id number, tupian blob ); import java.io.FileInputStream; import java.io.OutputStream; import java.sql.Connection; import java.sql.DriverManager; import j

java读取oracle数据库中blob字段

测试表 create table TEST_IMG ( ID INTEGER not null, NAME VARCHAR2(32), IMAGE BLOB ); 说明: 1.使用JDBC演示 2.IMAGE字段存储一个图片 程序代码如下: import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; im

oracle下更改分区字段

我们常常在更改oracle中分区字段时,会出现以下错误提示 ORA-14402: 更新分区关键字列将导致分区的更改 按照如下操作 打开row movement属性SQL> alter table tablename enable row movement; Table altered 再次执行update操作

访问oracle数据链路的blob字段值

访问照片表 select * from [email protected] where a1='11111'; 会报错:ora-22992 无法使用从远程表选择的LOB定位器 改为以下方法: 方法一: drop table temp Create  table temp as select * from [email protected] where a1='002'; select * from temp; 方法二: --创建表只需执行一次 Create global temporary ta

java 读写Oracle Blob字段

许久没有分享代码了,把这段时间写的一个Java操作Blob字段,有日子没写Java了,就当作笔记记录一下.1. [代码][Java]代码     跳至 [1] [全屏预览]package com.wanmei.meishu;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FileReader;import java.io.InputStream;import java.io.OutputS

JSP读取Oracle数据库里的图片Blob字段并显示在页面上<转>

java代码:首先定义一个读取Oracle数据库的Blob字段并把字节写入一个输出流的方法. 1 public static void writeImg(OutputStream os) { 2 Connection con; 3 try { 4 con = ConnectionFactory.getConnection(); 5 Statement stmt = con.createStatement(); 6 ResultSet rs = stmt.executeQuery("select

oracle中一些关于blob字段的操作

---恢复内容开始--- 1.在IDE中查看blob字段的内容可以采用: UTL_RAW.CAST_TO_VARCHAR2(blob)的方法,其中blob为表中blob字段的列名.这个方法限定结果不可超过2000字节. 2. 更新blob时,碰到德文乱码问题,最后采用的是在转换为byte[]后,再次转换为new String(ISO-8839-1)就可以

好记性不如烂笔头20-java对oracle的clob和blob字段的总结

整体情况 CLOB字段在实际工作中,还是有很多的应用场景:但是BLOB字段在现在的大型系统中,作用越来越不尽如人意. 因为数据库资源,在大型系统中,升级成本是最高的:而BLOB字段中大量的数据,会给数据库造成严重的IO问题.如果我们购买几百万的小型机,就是为了存放几张普通图片,估计会被人把牙齿笑掉:虽然数据库有良好的认证系统,但是不代表用文件系统不能实现. 因此,如果是老的系统,如果我们不打算全面重构和升级,那么这个BLOB改用还是要用:如果是新的系统,原则上不推荐BLOB字段,实现的代价较高,

Oracle数据库BLOB字段的存取

述]     Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据. 写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须使用cursor对 blob进行操作,因而你在写入Blob之前,必须获得cursor才能进行写入,那么如何获得Blob的cursor呢? 这需要你先插入一个empty的blob,这将创建一个blob的cursor,然后你再把这个empty的blob的cursor 用select查询出来