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

4

1 に答える 1

1

私はパーティショニングについてあまりやったことがありません (私は主に iSeries で DB2 を扱ってきました) が、私が理解していることから、通常はパーティション間で物事をシャッフルしたくはありません(つまり、パーティションを「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'))

....そして、行を消したいので、トランザクションの使用をほとんど無視できます。

(ちなみに、インジケーターに「はい」と「いいえ」を使用するのはひどいことです。論理 (ブール) 型のバージョンを使用していない場合は、文字「0」(false) と「1」(true) を格納します。 )))

于 2012-05-14T17:09:36.287 に答える