2012-05-12 31 views
0

私は数百万レコードのテーブルを持っています。条件に基づいてDB2テーブルのパーティション化と古いレコードの削除

___________________________________________________________ 
| 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カラムと2つ以上のsome_indicator値を使用してテーブルを分割するにはどうすればよいですか? 1つのパーティションには毎月の削除基準に該当するレコードを含める必要がありますが、1つのパーティションには毎年の削除基準レコードを含める必要があります。 このテーブルが頻繁に読み込まれてアップロードされている場合、テーブルのパーティション化に関連するパフォーマンス上の問題はありますか? 上記の要件に関するその他のベストプラクティスは必ず役立ちます。

答えて

1

私はパーティション化をあまりしていませんでしたが(私は主にDB2でiSeriesで働いていました)、私が理解したところでははありません。は一般的にパーティション間のものをシャッフルしたいパーティション '1ヶ月前')。たとえそれが可能であるかわからない。そうであれば、テーブルの一部(潜在的に大きい部分)を毎日スキャンして移動するだけで済みます(トランザクション内での選択、挿入、削除)。

さらに、パーティショニングはDB管理上の問題で、DBユーザーの問題、つまり古いレコードを削除するというように聞こえます。

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'を使用すると、がひどいです。論理型(boolean)のバージョンでない場合は、文字 '0'(false) 「1」(真))

関連する問題