创建表时是否为Oracle中的列保留了内存?

创建表时是否为Oracle中的列保留了内存?,oracle,memory,Oracle,Memory,例如: create table sample-name { sample-col-name number(1); } 如果我们看到上面的例子。创建表时,将创建“样本列名称”列。默认情况下,它需要22个字节,因为它保存数字数据类型。但是oracle会根据我们插入的值动态地提供内存。假设我们输入1个值,那么只给出1个字节。 我的问题是这22个字节是否被保留?那么,如果22个字节中分配了1个字节,那么其他21个字节是未使用的 谢谢。您似乎在问,一个数值是否占用了22个字节的存储空间,即使它不

例如:

create table sample-name
{
   sample-col-name number(1);
}
如果我们看到上面的例子。创建表时,将创建“样本列名称”列。默认情况下,它需要22个字节,因为它保存数字数据类型。但是oracle会根据我们插入的值动态地提供内存。假设我们输入1个值,那么只给出1个字节。 我的问题是这22个字节是否被保留?那么,如果22个字节中分配了1个字节,那么其他21个字节是未使用的


谢谢。

您似乎在问,一个数值是否占用了22个字节的存储空间,即使它不需要所有这些字节来存储它,正如文档所说,它们是以可变长度格式存储的

如果所有22个字节都被消耗掉,那么存储的每个数字都会浪费20个字节

您可以进行测试,以确保不会发生这种情况

create table t42 (n number(1));
column data_type format a10
select data_type, data_length from user_tab_columns where table_name = 'T42';

DATA_TYPE  DATA_LENGTH
---------- -----------
NUMBER              22
表最初没有分配存储(延迟段创建),但一旦添加一行,就分配一个段;64k在本例中:

select extents, bytes from user_segments where segment_name = 'T42';

no rows selected

insert into t42 select 1 from dual;

1 row inserted.

select extents, blocks, bytes from user_segments where segment_name = 'T42';

   EXTENTS     BLOCKS      BYTES
---------- ---------- ----------
         1          8      65536
您可以使用
vsize
dump
查看该值所需的存储,如链接答案中所述:

select n, vsize(n), dump(n) from t42;

         N   VSIZE(N) DUMP(N)             
---------- ---------- --------------------
         1          2 Typ=2 Len=2: 193,2  
如果表有32768(32k)行,每个行都有相同的一位数值,那么它要么需要65536(64k)的存储空间,每个行有两个字节,要么需要720896( 704k)的存储容量,每个存储容量为22字节。仅针对该列,无任何行开销(至少)或块开销(每个块约84-107字节)

因此,涉及到相当多的块和行开销。您可以通过一个包含更多列的表来了解需要多少:

drop table t42;
create table t42 (n1 number, n2 number, n3 number, n4 number, n5 number); 
insert into t42 select 1, 2, 3, 4, 5 from dual connect by level <= 1815;
select count(*), sum(vsize(n1) + vsize(n1) + vsize(n1) + vsize(n1) + vsize(n1)) as total_vsize from t42;

  COUNT(*) TOTAL_VSIZE
---------- -----------
      1815       18150

select extents, blocks, bytes from user_segments where segment_name = 'T42';

   EXTENTS     BLOCKS      BYTES
---------- ---------- ----------
         1          8      65536
删除表t42;
创建表t42(n1编号、n2编号、n3编号、n4编号、n5编号);

插入t42从dual connect by level中选择1、2、3、4、5您似乎在询问数字值是否占用了22个字节的存储空间,即使它不需要所有这些字节来存储它,正如文档所说,它们是以可变长度格式存储的

如果所有22个字节都被消耗掉,那么存储的每个数字都会浪费20个字节

您可以进行测试,以确保不会发生这种情况

create table t42 (n number(1));
column data_type format a10
select data_type, data_length from user_tab_columns where table_name = 'T42';

DATA_TYPE  DATA_LENGTH
---------- -----------
NUMBER              22
表最初没有分配存储(延迟段创建),但一旦添加一行,就分配一个段;64k在本例中:

select extents, bytes from user_segments where segment_name = 'T42';

no rows selected

insert into t42 select 1 from dual;

1 row inserted.

select extents, blocks, bytes from user_segments where segment_name = 'T42';

   EXTENTS     BLOCKS      BYTES
---------- ---------- ----------
         1          8      65536
您可以使用
vsize
dump
查看该值所需的存储,如链接答案中所述:

select n, vsize(n), dump(n) from t42;

         N   VSIZE(N) DUMP(N)             
---------- ---------- --------------------
         1          2 Typ=2 Len=2: 193,2  
如果表有32768(32k)行,每个行都有相同的一位数值,那么它要么需要65536(64k)的存储空间,每个行有两个字节,要么需要720896( 704k)的存储容量,每个存储容量为22字节。仅针对该列,无任何行开销(至少)或块开销(每个块约84-107字节)

因此,涉及到相当多的块和行开销。您可以通过一个包含更多列的表来了解需要多少:

drop table t42;
create table t42 (n1 number, n2 number, n3 number, n4 number, n5 number); 
insert into t42 select 1, 2, 3, 4, 5 from dual connect by level <= 1815;
select count(*), sum(vsize(n1) + vsize(n1) + vsize(n1) + vsize(n1) + vsize(n1)) as total_vsize from t42;

  COUNT(*) TOTAL_VSIZE
---------- -----------
      1815       18150

select extents, blocks, bytes from user_segments where segment_name = 'T42';

   EXTENTS     BLOCKS      BYTES
---------- ---------- ----------
         1          8      65536
删除表t42;
创建表t42(n1编号、n2编号、n3编号、n4编号、n5编号);

插入t42按级别从dual connect中选择1、2、3、4、5您真的是指“内存”还是指“存储”(通常在硬盘上?)两者不相同-答案可能相同,也可能不相同。不确定您为什么要引用创建表的点,但稍后请参阅插入;如果您实际上是指在插入时(这稍微有点道理),还请注意Oracle不会(几乎?)在任何事情上使用大括号。表定义应该包含在
(…)
中,而不是
{…}
中。对于大括号表示抱歉。我知道它是用大括号括起来的。关于内存或存储,我关心的是当我们看到一个表的所有列时,数据长度列表示它存储了多少字节,对于一个数字,它显示了22(字节),所以我不确定它属于哪一类,是内存还是存储。似乎你对存储而不是内存感兴趣。我链接的旧答案是否为您解释了这一点?您真的是指“内存”还是指“存储”(通常在硬盘上?)这两个答案不尽相同-答案可能相同,也可能不相同。不确定您为什么指的是创建表的点,但后来指的是插入;如果您实际上是指在插入时(这稍微有点道理),还请注意Oracle不会(几乎?)在任何事情上使用大括号。表定义应该包含在
(…)
中,而不是
{…}
中。对于大括号表示抱歉。我知道它是用大括号括起来的。关于内存或存储,我关心的是当我们看到一个表的所有列时,数据长度列表示它存储了多少字节,对于一个数字,它显示了22(字节),所以我不确定它属于哪一类,是内存还是存储。似乎你对存储而不是内存感兴趣。我链接的旧答案能为你解释吗?