当值不超过10个字节时,在Oracle中使用VARCHAR2(1000)
而不是VARCHAR2(10)
定义列会产生什么影响?
列是否仅占用存储值所需的空间,还是会对表空间/索引的大小/性能产生负面影响?
答案 0 :(得分:20)
答案取决于您是在谈论数据库表中的列,还是PL / SQL程序中的变量。
数据库专栏
使用的存储量与存储数据的大小成比例。
PL / SQL变量
如果变量声明的大小为1到4000(11g +)/ 1999(10g或更早),则将为最大长度分配内存(即VARCHAR2(100)将需要至少100个字节的内存)。 / p>
如果声明变量的大小为4001(11g +)/ 2000(10g或更早)或更大,则将根据存储的数据大小分配内存。 (一个有趣的问题是,如果变量的值发生了变化,内存大小如何调整 - 是否重新分配了另一个具有新大小的缓冲区?)
参考10g:PL/SQL Datatypes
小VARCHAR2变量针对性能进行了优化,而较大的变量针对高效内存使用进行了优化。截止点是2000字节。对于2000字节或更长的VARCHAR2,PL / SQL动态分配足够的内存来保存实际值。对于短于2000字节的VARCHAR2变量,PL / SQL预先分配变量的完整声明长度。例如,如果将相同的500字节值分配给VARCHAR2(2000 BYTE)变量和VARCHAR2(1999 BYTE)变量,则前者占用500个字节,后者占用1999个字节。
参考11g:Avoiding Memory Overhead in PL/SQL Code
为VARCHAR2变量指定 more 的大小超过4000个字符; PL / SQL等待您分配变量,然后只根据需要分配尽可能多的存储
答案 1 :(得分:13)
在数据库中,没有区别。 VARCHAR2
以可变长度存储,声明的长度只是一个限制。
但是,如果某些客户端应用程序看到该列定义为1000
10
字节而不是VARCHAR2(1000)
答案 2 :(得分:1)
将列大小定义为您准备处理的最大长度。 对于我正在将文件加载到数据库的临时表,我可以使用VARCHAR2(4000)。然后,一旦所有数据都在数据库中,我可以做任何我需要的验证(数据类型,数据长度,最小/最大值,可接受的字符......)并将有效值传递到具有适当定义的列中/约束
我可以利用DML error logging,以便不适合定义/约束的数据被抽取到拒绝表,而不需要任何棘手的逐行编码。
如果你有一个VARCHAR2(1000)那么,在某些时候你会得到比你想象的更长的数据(例如你可能会得到一个10个字符的字符串但是有14个字节,因为有些字符是多个字节字符集值。)