2009-12-10 59 views
20

在Oracle中,当值不超过10字节时,如何定义列为VARCHAR2(1000)而不是VARCHAR2(10)的影响是什么?定义具有较大长度的VARCHAR2列的影响

该列是否仅占用真正需要存储值的空间,否则会对表空间/索引的大小/性能产生负面影响?

回答

17

答案取决于您是在讨论数据库表中的列还是PL/SQL程序中的变量。

数据库列

存储的使用量是成比例的存储的数据的大小。

PL/SQL可变

如果变量声明的尺寸为1〜3999(11克+)/ 1999(10克或更早),存储器将被分配给最大长度(即VARCHAR2(100)将需要至少100个字节的内存)。

如果声明变量的大小为4000(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个字节。

+0

我在谈论表列,但PL/SQL引用也很有趣,谢谢! (+1) – 2009-12-11 08:35:28

+0

没错 - 请注意,当您开始编写与表数据交互的PL/SQL代码时,它变得更相关 - 即您可能倾向于使用与数据库列相同的大小声明VARCHAR2变量。 当然,这个内存使用率因素是IMO在列和变量大小方面最不重要的考虑因素。 – 2009-12-11 09:19:50

+4

在PL/SQL问题上,PL/SQL动态分配内存的临界点已经从一个版本变为另一个版本。例如,在10g中,它从增加到2000,但在11.1中增加到4000。请参阅http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/tuning.htm#BCGEGEEG – 2009-12-11 14:33:04

13

在数据库中,没有区别。 VARCHAR2以可变长度存储,声明的长度只是一个限制。

然而,一些客户端应用程序会保留每列而不是101000字节,如果他们看到的列被定义为VARCHAR2(1000)

0

定义列大小为你准备应对的最大长度。 对于临时表,我正在将文件加载到数据库中,我可以使用VARCHAR2(4000)。然后,一旦所有的数据都在数据库中,我可以做任何我需要的验证(数据类型,数据长度,最小/最大值,可接受的字符......),并将有效值传递到具有适当定义/限制。

我可以利用DML error logging,以便不符合定义/约束条件的数据在没有任何棘手的逐行编码的情况下被抽取到拒绝表。

如果你有一个VARCHAR2(1000),那么在某些时候你会得到比你期望的数据更长的数据(例如,你可能会得到10个字符的字符串,但有14个字节,因为有些字符是多 - 字节字符集值)。