create table TEST_BIG
(
  ID NUMBER(10)
)
tablespace QD_INTER
  pctfree 10
  pctused 40
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 64K
    minextents 1
    maxextents unlimited
    pctincrease 0
  );BEGIN 
FOR i IN 1 .. 100000
LOOP
INSERT INTO test_big VALUES (9999999999);
COMMIT;
END LOOP;
END;SELECT SUM(BYTES)/1024/1024 FROM User_Extents WHERE segment_name=upper('test_big');1.3125怎么和我想象的占用空间不一样啊

解决方案 »

  1.   

    100000 行  每行10个字节 100000*10pctfree 10 
    然后再 100000*10/0.9/1024/1024 什么的吧   也不是很了解其中的机制谢谢大家了哦~
      

  2.   

    number(10)大概占用6个字节。
    不过我觉得楼主通过计算tablespace增长的方式计算NUMBER的实际存储占用是不科学的。
    其实数据库存储的复杂程度是远远大于6Byte+6byte=12byte的。
    因为需要维护内模式的比如说 Btree的数据结构、索引、块等等。
      

  3.   

    oracle 存储空间是以区( extent )为单位分配的。
    就像 storage 
      ( 
        initial 64K 
        next 64K 
        minextents 1 
        maxextents unlimited 
        pctincrease 0 
      ); 指出的
    第一个区 64k, 第二个 64K
    以后每次增加 0%(pctincrease 0)
      

  4.   

    “每行10个字节”这个地方有问题,从你定义的表来看,NUMBER(10) 占6个字节,每行系统使用6个字节(这个不是固定的,和结构有关,其实和内容的长度也有一点关系),这样你的表每行占用12个字节。
    以8k块来计算,总共8192个字节,块系统开销大概96个字节,可用空间为8096个字节。pctfree = 10, 可用8096*0.9=7286 个字节。每个块可容纳 7286/12 = 607 行。一个extents容纳607*8= 4856行。100000行需要100000/4856 = 21个extents,总共占用空间 1.3125M。 和你查出来的空间使用一致。