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



我知道,在编写程序,声明字符串,int等时,根据值的类型分配了统一的内存。我还知道许多SQL方言中存在VARCHAR类型 - 一种动态数据类型,允许用户确定为列分配的存储量。但是,我很好奇是否有一种方法可以更改为特定单元格分配的存储量,无论其列的数据类型是什么(整数,真实,文本,斑点等)。例如,我不希望它保留在列中创建的每个单元格的特定存储空间,而是想要它,因此每个值只占用所需的真实空间 - 无论其真实类型的预定分配如何。

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

文本和斑点类型通常已经存储为动态存储,类似于文件。

varchar和varbinary通常是可变宽度,但取决于dbms。

可变宽度列导致行不再相同的行。这增加了并发症,因为现在DBMS无法使用简单的数学来知道任何行的启动 - 如果每个行都是X字节,则Nth行在字节X*N开始。使用可变长度行,该数学变得不可能。

dbms可以通过两种方式之一来处理此操作:

  • 行扫描 - 找到第n行,从第一行开始,找出它是多长时间,跳到末端找到下一行,找出它是多长时间..等等。
  • 索引:维护一个存储每行长度的表。

索引需要更多的内存(磁盘和RAM)才能保留,但是很快。行扫描不需要额外的内存,但是除最小的工作量外,所有人都非常慢。

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

它将因数据库供应商而有所不同,因此我可以从Oracle的角度告诉您。Oracle的Varchar2数据类型是一个可变长度字符串。您必须指定最大尺寸高达32K,但仅存储实际数据。您也可以在某些限制内更改数据型。例如,您可以将数字更改为varchar2()。但是,与varchar2()相比,Oracle Char Datatype是固定的长度,因此受到不同字符比较语义的影响。

我希望有帮助。

相关内容

最新更新