0

データベース内のユーザーごとに時間のかかるデータ計算を実行するレポートがあり、その結果、ユーザーごとに 10 から 20 の新しいレコードが計算されます。レポートの応答性を向上させるために、計算を実行し、結果をデータベースのスナップショット テーブルにダンプする夜間ジョブが作成されました。アクティブなユーザーに対してのみ実行されます。

したがって、5 万人のユーザーのうち 3 万人がアクティブな場合、ジョブは大きなスナップショット テーブル内の 30 万から 60 万のレコードを「更新」します。現在使用されている方法は、特定のユーザーの以前のすべてのレコードを削除してから、新しいセットを挿入することです。テーブルには PK はなく、データ セットをグループ化するためにビジネス キーのみが使用されます。

私の質問は、毎晩最大 600k のレコードを削除および追加する場合、これを処理するためにテーブルを最適化する手法はありますか? たとえば、データはオンデマンドで再作成できるため、これらの変更が行われたときにテーブルのログを無効にする方法はありますか?

アップデート:

1 つの問題は、スクリプトの動作方法が一度に 1 人のユーザーを調べるため、これをバッチで実行できないことです。そのため、ユーザーを調べ、前の 10 ~ 20 レコードを削除し、10 ~ 20 レコードの新しいセットを挿入します。これを何度も繰り返します。トランザクション ログの容量が不足したり、その他のパフォーマンスの問題が発生したりするのではないかと心配しています。データの保存や速度を低下させる可能性のあるその他の項目について心配するようにテーブルを構成したいと思います。更新中のテーブルに同時にアクセスしているため、インデックスなどをすべて削除することはできません。

4

3 に答える 3

1

また、インデックスを作成すると、この一括更新が遅くなるのではなく、速度が上がる可能性があることにも注意してください。なぜならUPDATE、andDELETEステートメントは、影響を受ける行を最初に特定できる必要があり、適切なインデックスがないと、テーブル スキャンに頼ることになるからです。

少なくとも、ユーザーを識別する列の非クラスター化インデックスを検討し、(2008年を使用していると仮定して)現在採用されMERGEている質量DELETE/INSERT方法の欠点を確実に回避できるステートメントを検討します.

The Data Loading Performance Guide (MSDN) によるとMERGE、トレース フラグを使用した挿入のログは最小限に抑えられています。

使用している SQL Server のバージョンがわかるまでは、これ以上多くを語ることはありません。

于 2012-10-04T15:13:42.360 に答える
0

これは一括挿入と呼ばれます。宛先テーブルのすべてのインデックスを削除し、挿入コマンドを大きなパック (数百の挿入ステートメント) で区切って送信する必要があります。;

もう 1 つの方法は、BULK INSERT ステートメントhttp://msdn.microsoft.com/en-us/library/ms188365.aspx
を使用する ことですが、データをファイルにダンプする必要があります。

参照: Sql Server の数百万のレコードを一括挿入する

于 2012-10-04T14:17:52.760 に答える
0

それは本当に多くのことに依存します

  • あなたのマシンの速度
  • 処理中のレコードのサイズ
  • ネットワーク速度

一般に、「ヒープ」またはインデックスのないテーブルにレコードを追加する方が高速です。そのため、すべてのインデックスを削除して、読み込み後に再作成すると、パフォーマンスが向上する場合があります。

アクティブなユーザーと非アクティブなユーザーでパーティション化すると、テーブルをパーティション化するとパフォーマンスが向上する可能性があります (ただし、この場合、データ セットは少し小さい場合があります)。

各微調整が負荷を追加または削減する時間をテストし、そこから作業してください。

于 2012-10-04T14:36:33.417 に答える