来自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个字节?
答案 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)