3

MyTable日付を持つ複数の int 列と日付を含む 1 つの列を持つテーブルがあります。日付列には、次のように作成されたインデックスがあります

CREATE INDEX some_index_name ON MyTable(my_date_column)

これは、ユーザーが指定した日付範囲の間でテーブルの内容がクエリされることが多いためです。テーブルには、それを指す外部キーはなく、シーケンス/トリガーによって埋められた自動インクリメント インデックスである主キー以外のインデックスもありません。

さて、私が抱えている問題は、このテーブルのデータが古くなったために、特定の期間、頻繁に置き換えられることです。したがって、更新される方法は、特定の期間内のすべてのエントリを削除し、新しいエントリを挿入することです。削除は次を使用して実行されます

DELETE FROM MyTable 
WHERE my_date_column >= initialDate 
  AND my_date_column < endDate

ただし、削除される行の数が非常に多いため (500 万行から 1200 万行)、プログラムは削除中にほとんどブロックされます。

操作を高速化するために無効にできるものはありますか? または、インデックスにオプションを指定して高速化することもできますか? これに関係するやり直し領域について何か読んだことがありますが、操作中にそれを無効にする方法がわかりません。

編集: プロセスは毎日実行され、過去 5 日間のデータが削除されます。次に、その 5 日間のデータ (外部ソースで変更されている可能性があります) が取り込まれ、データが再挿入されます。

削除されたデータの量は、テーブル内のデータ全体の量に比べてごくわずかです (< 1%)。したがって、保持したいデータを別のテーブルにコピーし、テーブルを削除して再作成することは、最善の解決策ではない可能性があります。

4

1 に答える 1

4

これを高速化するには2つの方法しか考えられません。

  1. これを定期的に行う場合は、月ごとにテーブルを分割することを検討してください。次に、削除したい月のパーティションをドロップするだけです。これは基本的に、テーブルを削除するのと同じくらい高速です。私が間違っていなければ、パーティショニングにはエンタープライズライセンスが必要です
  2. 保持したいデータを含む新しいテーブルを作成し( を使用create table new_table as select ...)、古いテーブルを削除して暫定テーブルの名前を変更します。これははるかに高速ですが、新しいテーブルですべてのインデックスと (プライマリ、外部キー) 制約を再作成する必要があるという欠点があります。
于 2013-09-22T21:40:08.337 に答える