0

私は大きく成長しているテーブルを持っています (現在 1,400 万行あり、数えています)。ログからの「エラー」のリストです。これらのエラーの一部は既知の問題であり、アップストリームで修正されている間に除外したいと考えています。テーブルには、'CheckedForFilter' と 'Filtered' の 2 つのビットがあります。10,000 行ブロックで次のことを行いたいと考えています。

 1) Select on 10,000 rows (where 'CheckForFilter' is false)
 2) Run a series of queries that set the 'Filtered' bit in certain criteria is true
 3) After the last query runs set the 'CheckForFilter' bit to true

「filtered」ビットを設定できるクエリのリストは現在 5 ですが、時間の経過とともに増えると思います。私の中心的な問題は、毎回同じ行のセットを選択する方法がわからないことです。実行時間が長すぎるクエリはサーバーのレプリケーションを遅らせるため、クエリを管理可能なサイズに保つ必要があります。

4

1 に答える 1

2

エラー テーブルに ID フィールドがある場合は、これを行うことができます。

次にチェックする 10,000 個の ID の最小 ID 値と最大 ID 値を含む「フィルター」テーブルを作成します。このテーブルには、すべてのフィルタがまだチェックされているかどうかを判断する「Checked」というフラグがあります。

エラー テーブルの ID が、「チェック済み」フィールド = 0 の「フィルター」テーブルの最小 ID 値と最大 ID 値の間にあるフィルター クエリを実行します。

完了したら、「フィルター」テーブルの最小および最大 ID 範囲内でこれらのレコードの CheckedForFilters フラグを更新します。

「filters」テーブルを更新し、「Checked」フィールドを 1 に設定します。必要に応じて、日付と時刻を保存することもできます。

完了するまで、次の 10,000 レコードに対してこれを実行します。

これにより、フィルターが実行されたときの履歴を保持することもできます。必要に応じて、これらのバッチごとに実行されたフィルターを別のテーブルに保存することもできます。

于 2012-11-20T16:16:09.593 に答える