And*_*niy 7 oracle database-design database-performance
列长度的倍增因子是否会以某种方式影响数据库性能?
换句话说,以下两个表的性能有什么区别:
TBL1:
- CLMN1 VARCHAR2(63)
- CLMN2 VARCHAR2(129)
- CLMN3 VARCHAR2(250)
Run Code Online (Sandbox Code Playgroud)
和
TBL2:
- CLMN1 VARCHAR2(64)
- CLMN2 VARCHAR2(128)
- CLMN3 VARCHAR2(256)
Run Code Online (Sandbox Code Playgroud)
我们是否应该总是尝试将列的长度设置为某个功率,2或者只考虑最大值?
一些开发人员声称数据库中列长度的倍增因子之间存在某种联系,因为它影响Oracle如何分配和保存磁盘上的数据并在内存中共享其缓存.有人可以证明或反驳这一点吗?
性能没有区别.并且由于2的幂,没有隐藏的优化.
唯一确实存储事物的方法是实际数据.存储在VARCHAR2(2000)列中的100个字符的存储方式与存储在VARCHAR2(500)列中的100个字符完全相同.
将长度视为业务约束,而不是数据类型的一部分.唯一可以推动您决定长度的因素是关于数据的业务限制.
编辑:长度确实产生影响的唯一情况是,当您需要该列的索引时.较旧的Oracle版本(<10)确实对密钥长度有限制,并在创建索引时进行了检查.
即使在Oracle 11中可行,但对于具有4000个字符的值具有索引可能不是最明智的选择.
编辑2:
所以我很好奇并设置了一个简单的测试:
create table narrow (id varchar(40));
create table wide (id varchar(4000));
Run Code Online (Sandbox Code Playgroud)
然后在两个表中填充由40'X'组成的字符串.如果存储之间确实存在(实质性)差异,那么在检索数据时应该以某种方式显示,对吧?
两个表都有1048576行.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> set autotrace traceonly statistics
SQL> select count(*) from wide;
Statistics
----------------------------------------------------------
0 recursive calls
1 db block gets
6833 consistent gets
0 physical reads
0 redo size
349 bytes sent via SQL*Net to client
472 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> select count(*) from narrow;
Statistics
----------------------------------------------------------
0 recursive calls
1 db block gets
6833 consistent gets
0 physical reads
0 redo size
349 bytes sent via SQL*Net to client
472 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL>
因此,两个表的全表扫描完全相同.那么当我们实际选择数据时会发生什么?
SQL> select * from wide;
1048576 rows selected.
Statistics
----------------------------------------------------------
4 recursive calls
2 db block gets
76497 consistent gets
0 physical reads
0 redo size
54386472 bytes sent via SQL*Net to client
769427 bytes received via SQL*Net from client
69907 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1048576 rows processed
SQL> select * from narrow;
1048576 rows selected.
Statistics
----------------------------------------------------------
4 recursive calls
2 db block gets
76485 consistent gets
0 physical reads
0 redo size
54386472 bytes sent via SQL*Net to client
769427 bytes received via SQL*Net from client
69907 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1048576 rows processed
SQL>
一致性获取略有不同,但这可能是由于缓存造成的.