删除LOB数据后, LOB空间不能重用的问题.

As records are deleted, the LOB data segments are marked as psuedo-deleted and they can only be reused when the ‘readLSN‘ of the table progresses past the LSN of when the deletes were performed(you can think of this as allowing read-stability isolation for any older open read transactions in case the pseudo-deleted LOB data is still needed by it). So, a new insert statement must constantly search the entire LOB space looking for free segments without being able to reuse the pseudo-delete LOB segments it comes by (not until whoever is holding up the readLSN is gone).

窗口1(session 1):

db2 "create table lob01 like sysibm.systables long in userspace1"
rm lob01*
db2 inspect check table name lob01 schema e97q7a results keep lob01.out
db2inspf lob01.out lob01.txt
cat lob01.txt

LOB Object Summary: Total Pages 0 - Used Pages 0
LBA Object Summary: Total Pages 1 - Used Pages 0

插入数据:

db2 "insert into lob01 select * from sysibm.systables"  
db2 "insert into lob01 select * from lob01"
db2 "insert into lob01 select * from lob01"
db2 "insert into lob01 select * from lob01"
db2 "insert into lob01 select * from lob01"
db2 "insert into lob01 select * from lob01"
db2 "select count(1) from lob01"

LOB Object Summary: Total Pages 15168 - Used Pages 15160
LBA Object Summary: Total Pages 16 - Used Pages 16

db2 "delete from (select * from lob01 fetch first 2000 rows only)"
db2 "delete from (select * from lob01 fetch first 2000 rows only)"
db2 "delete from (select * from lob01 fetch first 2000 rows only)"
db2 "delete from (select * from lob01 fetch first 2000 rows only)"
db2 "delete from (select * from lob01 fetch first 2000 rows only)"
db2 "delete from lob01"
db2 "select count(1) from lob01"

LOB Object Summary: Total Pages 15168 - Used Pages 15045
LBA Object Summary: Total Pages 16 - Used Pages 16

db2 "insert into lob01 select * from sysibm.systables"  
db2 "insert into lob01 select * from lob01"
db2 "insert into lob01 select * from lob01"
db2 "insert into lob01 select * from lob01"
db2 "insert into lob01 select * from lob01"
db2 "insert into lob01 select * from lob01"
db2 "select count(1) from lob01"

LOB Object Summary: Total Pages 15168 - Used Pages 15160
LBA Object Summary: Total Pages 16 - Used Pages 16

Used Pages没涨, delete的lob空间这里重用了.

窗口2(session 2):

readlsn(读操作hold住lob01表当前的lsn)

db2 +c "declare c1 cursor for select * from lob01"
db2 +c "open c1"
db2 +c "fetch from c1"

窗口1(session 1):

观察锁的情况.

db2pd -d sample -locks

Locks:
Address            TranHdl    Lockname                   Type       Mode Sts Owner      Dur HoldCount  Att        ReleaseFlg rrIID
0x0700000040FF9980 12         00000001000000010001652056 Internal V ..S  G   12         1   0          0x00000000 0x40000000 0     
0x0700000040FF9B80 12         4141414141424263C34A726E41 Internal P ..S  G   12         1   0          0x00000000 0x40000000 0     
0x0700000040FF9A80 12         00030021000000000000000054 Table      .IS  G   12         1   0          0x00003000 0x40000000 0

lob01表上了一个IS锁.

继续删除数据:

delete操作会更新lowTranLSN.

db2 "delete from (select * from lob01 fetch first 2000 rows only)"
db2 "delete from (select * from lob01 fetch first 2000 rows only)"
db2 "delete from (select * from lob01 fetch first 2000 rows only)"
db2 "delete from (select * from lob01 fetch first 2000 rows only)"
db2 "delete from (select * from lob01 fetch first 2000 rows only)"
db2 "delete from lob01"
db2 "select count(1) from lob01"

插入数据:

db2 "insert into lob01 select * from sysibm.systables"  
db2 "insert into lob01 select * from lob01"
db2 "insert into lob01 select * from lob01"
db2 "insert into lob01 select * from lob01"
db2 "insert into lob01 select * from lob01"
db2 "insert into lob01 select * from lob01"
db2 "select count(1) from lob01"

LOB Object Summary: Total Pages 30528 - Used Pages 30512
LBA Object Summary: Total Pages 31 - Used Pages 31

窗口2 hold住的readLSN< delete操作的LSN, readLSN之后的空间都不会被重用.

db2 "delete from (select * from lob01 fetch first 2000 rows only)"
db2 "delete from (select * from lob01 fetch first 2000 rows only)"
db2 "delete from (select * from lob01 fetch first 2000 rows only)"
db2 "delete from (select * from lob01 fetch first 2000 rows only)"
db2 "delete from (select * from lob01 fetch first 2000 rows only)"
db2 "delete from lob01"
db2 "select count(1) from lob01"

db2 "insert into lob01 select * from sysibm.systables"  
db2 "insert into lob01 select * from lob01"
db2 "insert into lob01 select * from lob01"
db2 "insert into lob01 select * from lob01"
db2 "insert into lob01 select * from lob01"
db2 "insert into lob01 select * from lob01"
db2 "select count(1) from lob01"

LOB Object Summary: Total Pages 45888 - Used Pages 45864
LBA Object Summary: Total Pages 46 - Used Pages 46

窗口3(Session 3):

在readLSN未释放的情况下, 对lob01表做reorg操作. 在U锁convert to Z锁的时候会发生锁等待, 因为z锁和IS锁冲突, 锁转换不受locktimeout参数控制(working as designed, 另外一个话题了), 导致reorg会hang住.

Locks being waited on :
AppHandl [nod-index] TranHdl    Lockname                   Type       Mode Conv Sts CoorEDU    AppName  AuthID   AppID                           
28       [000-00028] 12         00030021000000000000000054 Table      .IS       G   7713       db2bp    E97Q7A   *LOCAL.e97q7a.150423030505       
7        [000-00007] 2          00030021000000000000000054 Table      ..U  ..Z  C   2572       db2bp    E97Q7A   *LOCAL.e97q7a.150423025731

时间: 2024-10-04 15:53:58

删除LOB数据后, LOB空间不能重用的问题.的相关文章

mysql优化, 删除数据后物理空间未释放(转载)

OPTIMIZE TABLE 当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小.这是因为删除操作后在数据文件中留下碎片所致.OPTIMIZE TABLE 是指对表进行优化.如果已经删除了表的一大部分数据,或者如果已经对含有可变长度行的表(含有 VARCHAR . BLOB 或 TEXT 列的表)进行了很多更改,就应该使用 OPTIMIZE TABLE 命令来进行表优化.这个命令可以将表中的空间碎片进行合并,并且可以消除由于删除或者更新造成的空间浪费 .OPTIMIZE TABLE

关于mysql 删除数据后物理空间未释放

OPTIMIZE TABLE 当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小.这是因为删除操作后在数据文件中留下碎片所致.OPTIMIZE TABLE 是指对表进行优化.如果已经删除了表的一大部分数据,或者如果已经对含有可变长度行的表(含有 VARCHAR . BLOB 或 TEXT 列的表)进行了很多更改,就应该使用 OPTIMIZE TABLE 命令来进行表优化.这个命令可以将表中的空间碎片进行合并,并且可以消除由于删除或者更新造成的空间浪费 .OPTIMIZE TABLE

关于mysql 删除数据后物理空间未释放(转载)

转自 关于mysql 删除数据后物理空间未释放(转载) - NETDATA - 博客园http://www.cnblogs.com/shawnloong/archive/2013/02/07/2908911.html OPTIMIZE TABLE 当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小.这是因为删除操作后在数据文件中留下碎片所致.OPTIMIZE TABLE 是指对表进行优化.如果已经删除了表的一大部分数据,或者如果已经对含有可变长度行的表(含有 VARCHAR . B

关于mysql 删除数据后物理空间未释

OPTIMIZE TABLE 当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小.这是因为删除操作后在数据文件中留下碎片所致.OPTIMIZE TABLE 是指对表进行优化.如果已经删除了表的一大部分数据,或者如果已经对含有可变长度行的表(含有 VARCHAR . BLOB 或 TEXT 列的表)进行了很多更改,就应该使用 OPTIMIZE TABLE 命令来进行表优化.这个命令可以将表中的空间碎片进行合并,并且可以消除由于删除或者更新造成的空间浪费 .OPTIMIZE TABLE

mysql 清空或删除表数据后,控制表自增列值的方法

http://blog.sina.com.cn/s/blog_68431a3b0100y04v.html 方法1: truncate table 你的表名 //这样不但将数据全部删除,而且重新定位自增的字段 方法2: delete from 你的表名 dbcc checkident(你的表名,reseed,0) //重新定位自增的字段,让它从1开始 方法3: 如果你要保存你的数据,介绍你第三种方法,by QINYI 用phpmyadmin导出数据库,你在里面会有发现哦 编辑sql文件,将其中的自

包含LOB_Data列的表删除大量数据后表及数据库文件的收缩

最近有一张表(内含varchar(max)字段),占用空间达到240G,删除历史数据后几十万条后,空间并未得到释放. 然后用DBCC CLEANTABLE(0,tb_name,100)来释放删除记录后变长字段留下的空间,注意第三个参数为每个事务处理的行数, 强烈建议使用,默认是0,将整个操作作为一个事务处理!全程锁表!! 执行完DBCC CLEANTABLE后,发现表空间已经释放,占用空间几百兆,但此时还没完,我们数据库文件依然很大. 于是我们尝试用DBCC SHRINKFILE来收缩库文件,结

EMC Isilon(OneFS)删除重要数据后恢复案例

[故障描述]某大学因黑客入侵,导致其"教学系统"的重要数据被删除.其中包括"教学系统"中的MSSQL数据库,以及大量的MP4.ASF和TS类型的视频教学文件.整体存储架构采用EMC高端网络NAS(Isilon S200),节点数量为3个,每个节点配置12块3T STAT硬盘,无SSD.所有数据一共分两部分,一部分数据为vmware虚拟机(WEB服务器),通过NFS协议共享到ESX主机,另一部分数据为视频教学文件,通过CIFS协议共享给虚拟机(WEB服务器).黑客只删

关于mysql 删除数据后(.MYD,MYI)物理空间未释放

关于mysql 删除数据后物理空间未释放 OPTIMIZE TABLE 当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小.这是因为删除操作后在数据文件中留下碎片所致.OPTIMIZE TABLE 是指对表进行优化.如果已经删除了表的一大部分数据,或者如果已经对含有可变长度行的表(含有 VARCHAR . BLOB 或 TEXT 列的表)进行了很多更改,就应该使用 OPTIMIZE TABLE 命令来进行表优化.这个命令可以将表中的空间碎片进行合并,并且可以消除由于删除或者更新造成

SQL Server中sp_spaceused统计数据使用的空间总量不正确的原因

原文:SQL Server中sp_spaceused统计数据使用的空间总量不正确的原因 很多时候,我们经常使用sp_spaceused来查看表的空间使用情况,上个月群里有个网友说他使用DELETE删除了数据后,使用sp_spaceused查看,发现该表的分配的空间总量(reserved)与数据使用的空间总量(data)没有变化,当时和他讨论了并分析了一下原因,随手记录了一下这个案例,这个周末刚好有点时间,正好分析整理一下这个案例.分享在这篇文章.如下所示,我们先构造数据,我们的测试案例比较极端,