列长度的倍增因子是否会以某种方式影响数据库性能?
换句话说,以下两个表的性能有什么区别:
TBL1:
- CLMN1 VARCHAR2(63)
- CLMN2 VARCHAR2(129)
- CLMN3 VARCHAR2(250)
和
TBL2:
- CLMN1 VARCHAR2(64)
- CLMN2 VARCHAR2(128)
- CLMN3 VARCHAR2(256)
我们是否应该始终尝试将列的长度设置为某个2
的幂,或者只考虑最大值?
一些开发人员声称数据库中列长度的倍增因子之间存在某种联系,因为它会影响Oracle如何分配和保存磁盘上的数据并在内存中共享其缓存。有人可以证明或反驳这一点吗?
答案 0 :(得分:9)
性能没有差异。由于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));
然后用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>
一致性获取略有不同,但这可能是由于缓存造成的。