oracle比varchar大的,同样的数据,为什么varchar2(4000)比varchar2(1000)产生的redo大?

本文通过对比测试展示了VARCHAR2字段长度对Oracle数据库性能的影响。创建了两个表,一个使用VARCHAR2(4000),另一个使用VARCHAR2(1000),并插入相同数据。实验结果显示,虽然最终表大小相同,但在插入过程中,VARCHAR2(4000)的表产生了更多的DBBlockGets和Redo,表明字段长度增加确实对性能有一定影响。
摘要由CSDN通过智能技术生成

如题,在网上看的文章,做了下测试,不知道是为什么,求高手能解释一下,我看网上大多数人都说varchar2的长度不影响性能,但是从实验上看肯定是有影响的。

1、创建2张表,t1用varchar2(4000),t2用varchar2(1000)

create table t1(x number, x2 varchar2(4000),x3 varchar2(4000))  SEGMENT CREATION IMMEDIATE;

create table t2(x number, x2 varchar2(1000),x3 varchar2(1000))  SEGMENT CREATION IMMEDIATE;

2、分别向表中插入相同的数据

insert into t1 select level, rpad(' ', 100, ' '),rpad('a',100,'a') from dual connect by level <= 1e5;

insert into t2 select level, rpad(' ', 100, ' '),rpad('a',100,'a') from dual connect by level <= 1e5;

3、开启autotrace

SQL> insert into t1 select level, rpad(' ', 100, ' '),rpad('a',100,'a') from dual connect by level <= 1e5;

100000 rows created.

Execution Plan

----------------------------------------------------------

Plan hash value: 1236776825

------------------------------------------------------------------------------

| Id  | Operation              | Name | Rows  | Cost (%CPU)| Time     |

------------------------------------------------------------------------------

|   0 | INSERT STATEMENT              |      |           1 |           2   (0)| 00:00:01 |

|   1 |  LOAD TABLE CONVENTIONAL      | T1   |             |          |             |

|*  2 |   CONNECT BY WITHOUT FILTERING|      |             |          |             |

|   3 |    FAST DUAL              |      |           1 |           2   (0)| 00:00:01 |

------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

2 - filter(LEVEL<=1e5)

Statistics

----------------------------------------------------------

48  recursive calls

112998  db block gets

5588  consistent gets

0  physical reads

45758768  redo size

838  bytes sent via SQL*Net to client

860  bytes received via SQL*Net from client

3  SQL*Net roundtrips to/from client

2  sorts (memory)

0  sorts (disk)

100000  rows processed

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

SQL> insert into t2 select level, rpad(' ', 100, ' '),rpad('a',100,'a') from dual connect by level <= 1e5;

100000 rows created.

Execution Plan

----------------------------------------------------------

Plan hash value: 1236776825

------------------------------------------------------------------------------

| Id  | Operation              | Name | Rows  | Cost (%CPU)| Time     |

------------------------------------------------------------------------------

|   0 | INSERT STATEMENT              |      |           1 |           2   (0)| 00:00:01 |

|   1 |  LOAD TABLE CONVENTIONAL      | T2   |             |          |             |

|*  2 |   CONNECT BY WITHOUT FILTERING|      |             |          |             |

|   3 |    FAST DUAL              |      |           1 |           2   (0)| 00:00:01 |

------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

2 - filter(LEVEL<=1e5)

Statistics

----------------------------------------------------------

43  recursive calls

16829  db block gets

6660  consistent gets

0  physical reads

23691740  redo size

840  bytes sent via SQL*Net to client

860  bytes received via SQL*Net from client

3  SQL*Net roundtrips to/from client

2  sorts (memory)

0  sorts (disk)

100000  rows processed

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

4、最终两张表的block都是2944,一样大

SEGMENT_NAME           BLOCKS

------------------------------ ----------

T1             2944

T2             2944

5、从上面的测试看,最终结果是两张表一样大,但是insert的时候,t1产生的db block gets比t2要多很多,而且产生的redo比t2产生的redo多了将近一倍,这是为什么呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值