暂无图片
oracle 删除数据后新插入的数据写在哪里?
我来答
分享
暂无图片 匿名用户
oracle 删除数据后新插入的数据写在哪里?
暂无图片 5M

比如我一张表大小为450G,然后我删了100G数据,表空间使用大小还是464g,然后删了100G以后是350G,然后问题就是后面插入数据会使用这个表空间里删除的这100g的位置然后再使用464G扩展到480G的位置,还是会直接使用464G扩展到480G的位置这个删除的100G位置不用

我来答
添加附件
收藏
分享
问题补充
5条回答
默认
最新
请叫我囧半仙

会扩展新的空间来使用的,不使用删除数据的空间

暂无图片 评论
暂无图片 有用 0
打赏 0
西瓜你个吧啦

首先这个问题你要了解数据库的逻辑结构,段区块,一系列连续的块组成一个区,区是不能夸数据文件的,多个区组成一个段。

也就是说你可以理解你的数据会存储在一个叫段的逻辑存储结构中。表、索引、lob等特殊字段都会为其单独创建一个段,这个段里面会有至少一个64k的区,当数据越来越多,段里面的区就会不断增加,但到达一定坎的时候每次扩展的区大小也会变化,当表超过1000m时每新扩展一个区就会是64m

再来回答你标题的问题,段是一定会大于等于你数据大小的,默认段的大小是按区扩展的,那区是根据段大小自动计算下一个去殴打,最开始的时候是64k,最大的时候是分配64m。所以你可以理解你的表是一个或者多个预分配区组成的段(表、索引、lob等会单独段),所以在这个预分配空间中,你删除了其中一部分那就代表你的空间腾出来了,那有空间的情况不管啥数据看到是插入在当前的预分配空间中(段)。

再来聊聊为啥你这个空间不是按照你的删除的数据变化,因为在这里有个叫高水位的词,什么意思呢,做个比喻你可以这样理解,我插入了1000万条数据那表已经扩展到了300G的大小,这时候我删除中间的500w条,这时候数据大小应该是150G,但实际显示可能还在300g,我们可以理解为你的段里面虽然没存满,但是是断断续续的区块中有内容,所以他就保存当前情况,但是你的表时间在插入140G的数据,他还是显示300G。

当然正如前面所说你在特定的操作或者手动去回收的时候也可以高水位降下来。

暂无图片 评论
暂无图片 有用 0
打赏 0
PiscesCanon

oracle有个叫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
打赏 0
伟鹏

会直接使用464G扩展到480G的位置
这个问题跟“高水位线”有关,删除数据后,Oracle通常不会立即将空间返回给表空间,即使高水位线以下的空间变得空闲。这是为了提高未来数据插入的性能。

暂无图片 评论
暂无图片 有用 0
打赏 0
广州_老虎刘

如果是append方式插入, 就会申请新空间; 如果是传统方式(conventional)插入, 就会使用当前释放的100G空间.

暂无图片 评论
暂无图片 有用 2
打赏 1
夜的第七章灬
2024-05-23
怎么判断当前是以哪种方式插入的?
广州_老虎刘
答主
2024-05-24
append有以下几种情况: insert /*+ append */ into t_dest select ... ; insert /*+ parallel(4) enable_parallel_dml */ into t_dest select ; insert /*+ append_values */ into t_dest values(); create table xxx as select .... 其他情况就是conventional
回答交流
Markdown


请输入正文
提交
相关推荐
oracle中适合用序列做主键吗?
回答 7
已采纳
不适合吧,mysql的话适合自增,mysql索引组织表。oracle堆表适合用有意义的做主键
数据库 着急
回答 3
简单手写了下,没建表。可能要调试存储需要调用,不能直接接收输入,采用匿名代码块方式setserveroutputon;ACCEPTOIDNUMBERPROMPT'请输入医生ID:';ACCEPTOPv
请教下各位:从mysql到oracle之间的ogg同步配置,是否支持DDL?
回答 1
已采纳
下面摘自OGG18.1官方文档,MySQL支持的对象以及操作,可以看到支持DDL,并不是所有DDL都支持,具体版本的同样可以参考相应版本官方文档。https://docs.oracle.com/en/
ogg抽取进程报错: ERROR OGG-00446
回答 8
你viewreport抽取进程所有报错截图看看呢
db2中如何skip scan?是否和Oracle中的skip scan匹配
回答 1
Oracle中的skipscan在db2中叫做jumpscan,基本的作用都是类似的
12C用impdp导入数据没有生成日志文件
回答 3
我创建了两个目录,一个是douyusi对应root用户下的地址/oracle/douyusi,一个是douyusi对应oracle用户下的地址/home/oracle/douyusi,在执行impdp
应用开机自启
回答 9
谢谢专家
关于ora-01555的相关疑问
回答 6
明白了谢谢!
业务后台报错:无法从套接字读取更多数据
回答 1
重启tomcat呢?具体出错信息贴一下
dg备库日志都接受过来了,但是部分没有应用,需要查看哪个参数?
回答 1
Oracle日常运维之DG库日志应用慢参数调整实战