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

时间:2017-03-14 02:07:39

标签: sql database storage

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

如果我对此主题的理解似乎被误解或者您对该主题有任何见解,请分享。

2 个答案:

答案 0 :(得分:0)

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

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

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

DBMS可以通过以下两种方式之一来处理:

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

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

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

答案 1 :(得分:0)

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

我希望有所帮助。