DB2表分区并根据条件删除旧记录

时间:2012-05-12 09:46:35

标签: db2 delete-row

我有一张包含数百万条记录的表格。

___________________________________________________________
| col1 | col2 | col3 | some_indicator | last_updated_date |
-----------------------------------------------------------
|      |      |      |        yes     | 2009-06-09.12.2345|        
-----------------------------------------------------------
|      |      |      |        yes     | 2009-07-09.11.6145|
-----------------------------------------------------------
|      |      |      |        no      | 2009-06-09.12.2345|
-----------------------------------------------------------

我必须删除some_indicator = no时早于月份的记录。 再次,我必须删除年龄超过年份的记录,其中some_indicator = yes。这项工作将每天运行。

我可以使用db2分区功能满足上述要求吗? 如何使用last_updated_date列和以上两个some_indicator值对表进行分区? 一个分区应包含属于每月删除标准的记录,而其他分区应包含每年删除标准记录。 如果频繁读取,插入此表,是否存在与表分区相关的性能问题? 上述要求的任何其他最佳实践肯定会有所帮助。

1 个答案:

答案 0 :(得分:1)

我在分区方面做得不多(我主要在iSeries上使用DB2),但据我所知,你一般都想要在分区之间移动东西(即 - 在1个月前制作分区')。我甚至不确定它是否可能。如果是,您每天必须扫描一些(可能很大)的表,只需移动它(在事务中选择,插入,删除)。

除此之外,分区是一个数据库管理员问题,听起来你只是有一个数据库用户问题 - 即删除旧的'记录。我只是在几个陈述中这样做:

DELETE FROM myTable 
WHERE some_indicator = 'no'
AND last_updated_date < TIMESTAMP(CURRENT_DATE - 1 MONTH, TIME('00:00:00'))

DELETE FROM myTable
WHERE some_indicator = 'yes'
AND last_updated_date < TIMESTAMP(CURRENT_DATE - 1 YEAR, TIME('00:00:00'))

....你几乎可以忽略使用一个事务,因为你希望行消失。

(作为旁注,使用&#39;是&#39;并且&#39; no&#39;指示符很糟糕。如果您不在某个版本上有一个逻辑(布尔)类型,存储字符&#39; 0&#39;(虚假)和&#39; 0&#39;(真))