1

レポートの応答時間を短縮するために、マテリアライズド ビューのように機能するサマリー テーブルを作成しました。実際にデータを交換する方法をまだ決定していないため、データを更新する頻度はまだ決めていません。

キーに基づいてデータを更新することは、現在の構造ではオプションではありません。各レコードは多数の列の個別の組み合わせから作成され、そのうちのいくつかは null になる可能性があるためです。これにより、NULL 値が含まれる場合に複数の行に一致する更新が行われます。データベースのデータは 1 日に 1 回か 2 回しか更新されないため、頻繁に更新する必要はありません。

現在セットアップしているため、ストアド プロシージャは集計テーブルのデータを単純に切り捨て、すぐにクエリを再実行して最初から再作成します。何百万ものレコードからプルしているため、これには時間がかかる場合があります。データのダウンタイムを最小限に抑えるために、大規模なデータセットを非常に迅速に置き換えるための標準的な方法はありますか? 新しい集計データを一時テーブルにロードし、クエリの終了後に集計テーブルに移動するようなものでしょうか?

4

1 に答える 1

2

この種の問題を回避するために私が効果的に使用した DB カンフーを次に示します。単純なデータ駆動型スイッチを使用して、データの現在のバージョンと次のバージョンを切り替えます。

これを実際に実行するための SQL を次に示します。

スイッチを保持するテーブルをどこかに作成します(設定テーブルなどがある場合は、ここで何でも使用できます):

create table data_switch(val int not null); // this will hold one row

次に、データ テーブルを変更して、データのバージョン番号の列を追加します。

alter table my_data add column data_version int;

最後に、2 つのデータをリンクするビューを作成し、data_version の値によってどのデータ セットが使用されるかを決定します。

create view current_data as
select * from my_data
where data_version = (select val from data_switch);

データを生成するときに、data_version に新しい値を割り当てます。使用する準備ができたら、使用した新しい値と一致するように data_switch の値を更新するだけです。

これにより、古いバージョンを保持したり、新しいバージョンが壊れている場合に元に戻したり、新しいデータを計算するのに必要な時間だけ取り、必要なときに古いバージョンを切り捨てたり、バージョン間の切り替えを瞬時に行うことができます。シンプルで機能します。

これを実装する方法を正確に変えることができますが、これは一般的な考え方です。

于 2012-04-06T01:21:12.763 に答える