代码之家  ›  专栏  ›  技术社区  ›  Peter Lang

定义更大长度的varchar2列的影响

  •  23
  • Peter Lang  · 技术社区  · 15 年前

    用什么定义列的效果 VARCHAR2(1000) 而不是 VARCHAR2(10) 在Oracle中,当值不超过10字节时?

    列是否只占用存储值所需的空间,或者对表空间/索引的大小/性能有任何负面影响?

    3 回复  |  直到 5 年前
        1
  •  20
  •   Luke    5 年前

    答案取决于您所说的是数据库表中的列,还是pl/sql程序中的变量。

    数据库列

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

    PL/SQL变量

    如果变量声明的大小为1到4000(11g+)/1999(10g或更早),则将为最大长度分配内存(即varchar2(100)需要至少100字节的内存)。

    如果变量声明的大小为4001(11g+)/2000(10g或更早)或更大,则将根据存储的数据大小分配内存。(一个有趣的问题是,如果变量的值发生了变化,那么内存的大小是如何调整的——它是否用新的大小重新分配了另一个缓冲区?)

    10g参考: PL/SQL Datatypes

    小的varchar2变量针对性能进行了优化,大的变量则针对有效的内存使用进行了优化。截止点是2000字节。对于2000字节或更长的varchar2,pl/sql只动态分配足够的内存来保存实际值。对于小于2000字节的varchar2变量,pl/sql预分配变量的完整声明长度。例如,如果将相同的500字节值赋给varchar2(2000字节)变量和varchar2(1999字节)变量,则前者占500字节,后者占1999字节。

    11g参考: Avoiding Memory Overhead in PL/SQL Code

    指定大小为 更多 varchar2变量的长度超过4000个字符;pl/sql等待直到您分配该变量,然后仅根据需要分配尽可能多的存储空间。

        2
  •  13
  •   Quassnoi    15 年前

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

    但是,一些客户端应用程序将保留 1000 每列字节数,而不是 10 如果他们看到列定义为 VARCHAR2(1000)

        3
  •  1
  •   Gary Myers    15 年前

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

    我可以利用 DML error logging 这样,不符合定义/约束的数据就被抽取到拒绝表中,而不需要进行任何复杂的逐行编码。

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