0

invoice_data12 年間の請求書に関するデータを含むテーブルを考えてみましょう。このデータは毎日キューブにロードされます。ロードするたびに、最新の 2 年間が削除されinvoice_data、最後の 2 年間のデータがライブ システムによって再度インポートされます。(古いデータセットでも値が変わる可能性があるため、これを行います)

このdeleteステートメントには約 15 分かかりますが、 を使用することはできませtruncateん。これは、12 年全体をロードする必要があり、さらに時間がかかるためです。

質問:

invoice_datこのように大きなテーブルを分割するのは良いデザインですか?

  • invoice_data_old、 を含むyears < actual year - 2
  • invoice_data_new、 を含む years >= actual year -2

このように、truncateonを使用でき、ステートメントinvoice_data_newを使用する必要はありませんか?delete

より良いアプローチはありますか?

SQL SERVER 2008 を使用していますが、これは一般的な質問だと思います。

4

3 に答える 3

1

この問題への最善のアプローチは「水平パーティショニング」だと思います。基本的に、データのスライディング ウィンドウを作成します。新しい期間のデータが最後に追加されると、古いデータは最初に削除されます。

4 年間で、48 個のパーティション (1 か月に 1 個) を持つ可能性があります。

このアプローチの大きな利点は、SQL サーバーがデータがこのように分割されていることを認識しており、関連するデータを持つパーティションのみを使用するようにクエリを自動的に最適化できることですselect。 1 つのパーティション、つまりデータの 1/48 を検索します。

もう 1 つの重要な側面は、最も古いパーティションを削除するとメタデータ操作になるため、何もロックされないことです。

このアプローチの欠点は、セットアップと保守の点でより多くの労力がかかることです (自動化された月末スクリプトを作成しない限り、これは重要な作業になる可能性があります)。

于 2012-08-22T10:11:49.530 に答える
1

Oracle では、パーティション化されたテーブル (年ごとにパーティション化) を使用します。あなたはそれからすることができます

  • データを 2 つの新しいテーブルにロードする
  • パーティション交換を使用して、既存のパーティションを新しいデータと交換します
  • 古いデータを捨てる

パーティションのスワッピングは非常に高速です。どうやら SQL Server には非常によく似たものがあります。SQL Server のパーティション交換に関する SO の質問を参照してください。

于 2012-08-22T10:07:00.010 に答える
0
  • 日ごとにテーブルを分割する
  • 過去 2 年間のパーティションを削除
  • 新しいデータをインポートする
于 2012-08-22T10:12:01.293 に答える