0

我有一张有几百万条记录的表。

___________________________________________________________
| 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 值对表进行分区?一个分区应包含符合每月删除标准的记录,而另一个应包含每年删除标准的记录。如果经常读取、更新此表,是否存在与表分区相关的性能问题?上述要求的任何其他最佳实践肯定会有所帮助。

4

1 回答 1

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'))

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

(作为旁注,使用 'yes' 和 'no' 作为指标是很糟糕的。如果您使用的不是具有逻辑(布尔)类型的版本,请存储字符 '0' (false) 和 '1' (true) ))

于 2012-05-14T17:09:36.287 回答