【发布时间】:2018-02-20 08:17:19
【问题描述】:
来自 Oracle 文档:
如果您为每列指定其数据的最大长度或精度 类型,那么您的应用程序不必要地分配了许多兆字节的 内存。例如,假设查询选择 10 VARCHAR2(4000) 列和批量提取操作返回 100 行。您的 RAM 应用程序必须分配 10 x 4,000 x 100 — 几乎 4 MB。在 相反,如果列长度为 80,则您的应用程序的 RAM 必须分配 10 x 80 x 100 — 大约 78 KB。这个区别是 对单个查询很重要,您的应用程序将处理许多 并发查询。因此,您的应用程序必须分配 4 每个连接需要 MB 或 78 KB 的 RAM。
据我所知 varchar2 是可变长度数据类型,因此 DB 只会分配列实际使用的空间,即如果列在 Unicode 中只有 10 个字符,它将分配 10 个字节。但是按照上面的说法,即使column(max)只有10个字符,但是数据类型的长度定义为4000,还是会占用4000字节?
【问题讨论】:
-
您的应用程序如何知道在 SELECT 完成之前您实际使用了
VARCHAR(4000)的多少个字符?它不能,所以它必须分配足够的空间来接受整个VARCHAR(4000)。你读错了那段;它指的是您的应用必须分配以读取数据的空间,而不是数据库中实际使用的存储空间。 -
是的,数据库将使用声明的长度,即使没有全部使用,该数据量也会返回到您的应用程序。
-
@TimBiegeleisen 。 . .
varchar2真的是这样吗?如果是这样,为什么要使用它而不是char? -
嗨戈登,也许我误读了引用的文档,也许你应该给出答案。
-
@KenWhite 我不明白我们为什么要谈论“应用程序”,而这个过程发生在数据库内部,然后才离开它的边界。我相信数据库引擎将获得结果集并通过线路将它们以块的形式发送到数据库客户端,因此它是动态分配的。对于像 Oracle DB 这样复杂的软件来说,很难发现我的列实际上不是 4000 字节,而是实际上只有 10 字节,考虑到它没有像 char 那样被空白填充。事实上,DB 知道它提取到结果中的字节数,它可以通知客户端。