Oracle SQL VARCHAR2数据类型存储

时间:2017-09-12 01:51:15

标签: sql oracle

来自Oracle docs:

  

如果为每列提供其数据的最大长度或精度   类型,然后您的应用程序不必要地分配许多兆字节   内存。例如,假设查询选择10 VARCHAR2(4000)   列和批量提取操作返回100行。你的RAM   应用程序必须分配10 x 4,000 x 100 - 几乎4 MB。在   相比之下,如果列长度为80,那么你的应用程序的RAM   必须分配10 x 80 x 100-about 78 KB。这种差异是   对于单个查询很重要,您的应用程序将处理许多   同时查询。因此,您的应用程序必须分配4   每个连接有MB或78 KB的RAM。

我知道varchar2是可变长度数据类型,因此DB只会分配列实际使用的空间,即如果列在Unicode中只有10个字符,它将分配10个字节。但根据上述说法即使列(max)只有10个字符,但数据类型的长度定义为4000,它仍然会占用4000个字节?

3 个答案:

答案 0 :(得分:1)

在磁盘上分配的空间只会与存储每行的实际数据所需的时间一样长。

在内存中分配的空间(在某些情况下)将是基于数据类型所需的最大值。

答案 1 :(得分:1)

文档本身在某些方面是错误的/误导性的。在引用的段落之前的句子说“...长度和精度影响存储要求。”然而,在那之后,编写文档文章的dufus继续引用RAM。存储意味着磁盘; RAM是内存。除非我们讨论内存数据库(文档文章没有这样做),否则在说出“影响存储要求”后谈论RAM是没有意义的。声明的长度不会影响存储,但可能影响内存分配。

具体来说,当应用程序(通常用Java,C#等通用语言编写)需要提前分配内存时,它可能影响内存分配,当时他们拥有的唯一信息就是在数据字典中。内存可以静态分配(在编译时),但这意味着你不能使用实际数据中的额外信息,所有字符串最多都是100字节;所有已知的AT THAT STAGE最大值为4000字节。内存也可以动态分配,并且可以使用额外的信息 - 但它很多,慢得多!

在DB和用其他语言编写的应用程序之间的许多“交互”中,您甚至没有动态内存分配选项;在当今世界,假设“时间”比RAM更有价值,所以如果你发现你的代码内存不足,就买更多的RAM而不用担心动态内存分配。这意味着如果您声明VARCHAR2(4000),您应该会以浪费的方式分配大量的RAM。如果你需要,只需声明VARCHAR2(100)。

答案 2 :(得分:0)

这个有趣问题的来源是here

文章非常清楚VARCHAR2存储:

  

Oracle数据库空白填充存储在CHAR列中的值,但不存在   存储在VARCHAR2列中的值。因此,VARCHAR2列使用   空间比CHAR列更有效。

他们对RAM分配的看法是,如果您没有为VARCHAR2列定义限制,您的应用程序将不知道要分配多少RAM。此外,如果限制太高,它将分配太多的RAM开始,所以总是选择最有效的限制。

还有一篇关于OCI使用数据类型here的综合文章。