为什么没有DELETE + REORG可用磁盘空间(DB2)?


18

在DB2中,我有一个包含大型二进制数据的表。现在,我清除了整个表并运行runstats,reorg,runstats,但是所占用的磁盘空间没有改变。这有什么问题吗?

该表位于自己创建的表空间中,如下所示:

CREATE BUFFERPOOL "MY_BP" SIZE 250 AUTOMATIC PAGESIZE 4096;
CREATE LARGE TABLESPACE MY_TBS IN DATABASE PARTITION GROUP IBMDEFAULTGROUP PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE EXTENTSIZE 64 PREFETCHSIZE 64 BUFFERPOOL MY_BP OVERHEAD 10.500000 TRANSFERRATE 0.140000 FILE SYSTEM CACHING;

我删除/重组如下:

DELETE FROM MY_TBL
RUNSTATS ON TABLE MY_TBL WITH DISTRIBUTION AND DETAILED INDEXES ALL
REORG TABLE MY_TBL
RUNSTATS ON TABLE MY_TABLE WITH DISTRIBUTION AND DETAILED INDEXES ALL
ALTER TABLESPACE MY_TBS REDUCE

表MY_TBL在此之前占用了2.5GB的空间,在删除/重组后仅占用了3 MB的空间

FWIW:我正在运行DB2 / NT v9.5.2。


这对db2 v8上的系统有效吗?
托尼

Answers:


22

我将猜测您正在使用自动存储。(并不是说否则可能会发生……使用自动存储很容易发生这种情况。)

问题很可能是您的数据库回收了自身的空间,但没有将磁盘释放回操作系统。通过检查表空间的高水位标记,可以很容易地显示出来。

执行以下

db2 list tablespaces show detail

这将显示每个表空间及其在磁盘上的用途。Used pages数据库正在使用多少页磁盘。将其与total pages(磁盘上已声明的总数)进行比较,High water mark (pages)它将显示您是否“声明”了超出实际需要的数量。(即,使用率低的页面,非常高的总页面数和接近总页面数的高水位标记)。

为了摆脱这个未使用的空间,并返回给你的操作系统发出以下(下自动存储)db2 alter tablespace <tablespace name> reduce max。例

db2 alter tablespace ts1 reduce max;

这将导致DB2降低高水位线并将未使用的磁盘释放回操作系统。(请注意,您只能对常规和大型表空间执行此操作,而不能对系统临时表空间或用户临时表空间执行此操作)。

如果使用不带自动存储的DMS,则需要使用稍微不同的命令集:

db2 alter tablespace <tablespace name> lower high water mark;
db2 alter tablespace reduce (<containter name> or [all containers] integer K|M|G or integer PERCENT);

db2 alter tablespace ts1 lower high water mark;
db2 alter tablespace reduce (all containers 500 M);

在我们工作的地方,我们将其放入一些维护脚本中,以便在进行重组以确保回收磁盘空间后自动运行该维护脚本。在我们的例子中,我们使用DB2 LUW 9.7 FP 4,因此仔细检查9.5的信息中心以确保您可以访问适合您的版本的信息并没有什么坏处。

编辑:如果您的表空间来自升级到DB2 9.7的数据库,则可能不会设置可回收存储属性。即使从DMS升级到自动存储也是如此。两种方法都会咬人,因为您实际上无法降低高水位线。您必须转储表和数据,删除表空间。然后,使用自动存储重新创建表空间并导入表数据。


+1-很高兴看到DB2专家为该站点做出了贡献。过去,我们在该领域一直很弱。
菲尔·

1
简短的评论,在DB2 9.5中,您不能使用alter tablespace <tbsp> lower high watermarkalter tablespace <tbsp> reduce max语法–直到DB2 9.7才引入。
伊恩·比约霍夫德

正如我在最初的帖子中提到的那样,我已经尝试了大部分,但没有成功。到目前为止,我自己找到了解决方案:无法回收磁盘空间,因为我没有指定LONGLOBDATA选项,如果要从BLOB或CLOB回收磁盘空间,这似乎是必需的。请在这里查看我对自己问题的回答。无论如何,我感谢您为答案付出的努力,+ 1!
2013年

9

该表MY_TBL在一BLOB列中包含大型二进制数据。该REORG命令的文档说DB2避免了重新组织此类对象,因为它既费时又不能改善集群。但是,如果LONGLOBDATA指定了该选项,则可以强制DB2重新组织LOB数据。DB2可以重用未使用的空间,因此,在分配新数据之前,插入新数据将首先填充现有的未使用页面。

跑步

REORG TABLE MY_TBL LONGLOBDATA

成功回收了空表正在使用的2.5GB磁盘空间。

我不了解此选项,因此在我第一次阅读文档时对其进行了监督。


好点子。但是,从我刚刚从DB2NightShow情节“ Attack of the Blob”中学到的知识,您并不想太频繁地运行LONGLOBDATA选项,因为它会花费更长的时间和/或引起性能问题(如果您尝试进行在线REORG) 。
克里斯·奥尔德里奇

我们正在处理的数据库包含工业机器的日志数据。对此类数据库的查询不是时间紧迫的,因此,如果在重组期间性能下降,这不是问题。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.