是否可以更改数据库中特定单元格的存储分配?

Is it possible to change the storage allocation for specific cells in a database?

我知道在编写程序时,在声明字符串、int 等时,会根据值的类型分配统一数量的内存。我还知道在许多 SQL 方言中都存在 varchar 类型——一种允许用户确定为列分配的存储量的动态数据类型。但是,我很好奇在任何现代数据库环境中是否有一种方法可以更改为特定单元格分配的存储量,而不管它们的列的数据类型是什么(INTEGER、REAL、TEXT、BLOB 等)。例如,我不想为列中创建的每个单元格保留特定数量的存储 space,而是希望每个值只占用它需要的真实数量 space——无论其真实类型的预定分配。

如果我对这个话题的理解似乎有误,或者您对这个话题有任何见解,请分享。

TEXT 和 BLOB 类型通常已经存储为动态存储,非常类似于文件。

VARCHAR 和 VARBINARY 通常是可变宽度的,但这取决于 DBMS。

可变宽度的列导致行的长度不再相同。这增加了一个复杂性,因为现在 DBMS 不能使用简单的数学来知道任何行从哪里开始——如果每行都是 X 字节,那么 Nth 行从字节 X*N 开始。对于可变长度的行,数学变得不可能。

DBMS 可以通过以下两种方式之一处理此问题:

  • 行扫描-找到第N行,从第一行开始,找出它有多长,跳到最后找到下一行,找出它有多长..等等。
  • 索引:维护一个 table 来存储每一行​​的长度。

索引需要更多内存(磁盘和内存)来保存,但速度很快。行扫描不需要额外的内存,但对于除最小工作负载之外的所有工作负载来说都非常慢。

除非您要处理较大的可变长度值,否则通常不值得使用可变长度类型。

它会因数据库供应商而异,所以我可以从 Oracle 的角度告诉您。 Oracle 的 VARCHAR2 数据类型是可变长度的字符串。您必须指定最大 32k 的最大大小,但只会存储实际数据。 您也可以在某些限制范围内更改数据类型。例如,您可以将 NUMBER 更改为 VARCHAR2()。 然而,Oracle CHAR 数据类型是固定长度的,因此与 VARCHAR2() 相比,它具有不同的字符比较语义。

希望对您有所帮助。