匿名用户
5M比如我一张表大小为450G,然后我删了100G数据,表空间使用大小还是464g,然后删了100G以后是350G,然后问题就是后面插入数据会使用这个表空间里删除的这100g的位置然后再使用464G扩展到480G的位置,还是会直接使用464G扩展到480G的位置这个删除的100G位置不用
会扩展新的空间来使用的,不使用删除数据的空间
评论
有用 0首先这个问题你要了解数据库的逻辑结构,段区块,一系列连续的块组成一个区,区是不能夸数据文件的,多个区组成一个段。
也就是说你可以理解你的数据会存储在一个叫段的逻辑存储结构中。表、索引、lob等特殊字段都会为其单独创建一个段,这个段里面会有至少一个64k的区,当数据越来越多,段里面的区就会不断增加,但到达一定坎的时候每次扩展的区大小也会变化,当表超过1000m时每新扩展一个区就会是64m
再来回答你标题的问题,段是一定会大于等于你数据大小的,默认段的大小是按区扩展的,那区是根据段大小自动计算下一个去殴打,最开始的时候是64k,最大的时候是分配64m。所以你可以理解你的表是一个或者多个预分配区组成的段(表、索引、lob等会单独段),所以在这个预分配空间中,你删除了其中一部分那就代表你的空间腾出来了,那有空间的情况不管啥数据看到是插入在当前的预分配空间中(段)。
再来聊聊为啥你这个空间不是按照你的删除的数据变化,因为在这里有个叫高水位的词,什么意思呢,做个比喻你可以这样理解,我插入了1000万条数据那表已经扩展到了300G的大小,这时候我删除中间的500w条,这时候数据大小应该是150G,但实际显示可能还在300g,我们可以理解为你的段里面虽然没存满,但是是断断续续的区块中有内容,所以他就保存当前情况,但是你的表时间在插入140G的数据,他还是显示300G。
当然正如前面所说你在特定的操作或者手动去回收的时候也可以高水位降下来。
评论
有用 0oracle有个叫ASSM的技术,即自动段空间管理,ASSM的整体结构是3层位图块+数据块,如下:
L3块:段头
|
/ \
L2块 L2块
|
/ \
L1块 L1块
|
/ \
数据块 数据块
除了insert /*+ append */(这种情况是直接高水位线以后申请新空间进行insert数据,进而抬高了高水位线),当向表中插入数据时,
Oracle通过数据字典确定L3段头位置,通过L3找到第一个有可用数据块的L2块,
然后根据会话的OS进程PID进行HASH算法达到一个值X,然后这个X就是确定了这个L2块中第X个L1块为目标,
然后继续根据会话的OS进程PID进行HASH算法达到一个值Y,这个Y就是L1中第Y个数据块,这个时候数据将会再这个数据块中insert直到块满。
因此你的问题是Oracle会不会使用删了的100G,肯定是会的,被删了的100G让数据块变成未满数据的数据块,会成为上述ASSM的规则下的目标数据块被insert的时候选择。
题外话,ASSM规则实际上是支持了大并发插入,因为每个会话会得到不同的随机值X和Y,这样不同会话insert的时候能够分散使用不同的数据块进行insert,从而提高并发。当然,还受到高水位线限制。当ASSM规则下insert时没有可使用的块,高水位线会上移。
另外,你也可以看看这个,【Oracle】表碎片重用规则
评论
有用 0会直接使用464G扩展到480G的位置
这个问题跟“高水位线”有关,删除数据后,Oracle通常不会立即将空间返回给表空间,即使高水位线以下的空间变得空闲。这是为了提高未来数据插入的性能。
评论
有用 0如果是append方式插入, 就会申请新空间; 如果是传统方式(conventional)插入, 就会使用当前释放的100G空间.
评论
有用 2
墨值悬赏

