如题,在网上看的文章,做了下测试,不知道是为什么,求高手能解释一下,我看网上大多数人都说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多了将近一倍,这是为什么呢?