web-dev-qa-db-ja.com

時間切れになったときにテーブルのエントリを更新する

時間に基づいて、テーブルのエントリを変更する必要があります。

つまり、テーブルにはcustomer-infoとsubscription-infoが含まれています。各ユーザーのサブスクリプションが期限切れになったときにサブスクリプションを変更/削除する必要があります。

テーブルには最大200〜300万のエントリを含めることができます。

ユーザーごとに有効期限が異なるため、これを達成するための最良の方法は何ですか?

時間が経過したときにトリガーされる何らかのトリガーメカニズムはありますか?

または、毎秒ポールするイベントを作成するか、サブスクライバーごとに個別のイベントを作成しても安全ですか?

または、有効期限を維持し、タイマーの期限が切れたときにアクションをトリガーするサードパーティのタイマーツールを使用しても安全ですか?

または、この要件に対処するためのより良いアプローチはありますか?

btw:データベースはSQLサーバーです。

おかげでよろしく、Prasun

1
prasun bheri

トリガーは、特に大量のヒットが発生する可能性のある大きなテーブルの場合、最適なソリューションではありません。

単純なストアドプロシージャを正しく実行し、それを定期的に実行するSQL Serverエージェントジョブを用意します(ビジネスの目的で必要とされる頻度で)。

次のような簡単なもの:

UPDATE 
    custSubsTable 
SET 
    subscritionActive = 0
WHERE 
    subscritionActive = 1
        AND
    expiryDate < GETDATE()

うまくいくでしょう。 WHERE句の前半は厳密には必要ないと思いますが、問題はありません。コードをジョブに直接挿入するだけで、ストアドプロシージャとしてより簡単に維持できます。手動で実行できます

これは、更新ではなく削除するように簡単に変更できます。または、同じテーブル内の別の行を(テーブル自体を結合することによって)削除/更新することもできますが、その場合は、ベストプラクティスで非正規化を指示しますdbとテーブルの分割。

大きなテーブルであっても、十分な頻度で実行すれば、実行するのにかなり迅速なステートメントになるはずです。明らかに、一度に加えなければならない変更が多くなるほど、長くなる可能性があります。最初に手動で手動で実行し、インデックスを追加/更新してください必要な場合

これは複数のテーブルで実行できます-ここでは説明しません。質問の範囲を超えています(そして、DBについては何も知りません)が、私の第一印象は、純粋にあなたの質問でのあなたの発言からです。顧客とサブスクリプションのデータを1つのテーブルに保持すると、多くの非正規化につながる可能性があります。

1
Ian_H

私はこの巨大なデータセットで毎秒1分ごとにクエリを実行することにあまり慣れていません。代わりに、有効期限を監視し、タイマーが切れたときにアクションを実行する別の(タイマーモジュール)プロセスを作成することにしました。このツールをRest APIと統合して、新しいエントリが追加されるたびにタイマーモジュールを更新しました。

これまでのところ、ソリューションはうまく機能しています。しかし、私はこのアプローチの長期的な影響を認識していません。

後で変更する場合は、投稿を更新します。

ありがとう。

0
prasun bheri

30秒ごとに実行するジョブを1つ作成します。

  1. 列をもう1つ追加します:ExpireTime ... LicenseValid。
  2. ジョブはLicenseIsValid ='Y' and time is < Now –次にupdate... LicenseValid = N...

ジョブはプロシージャまたは関数になります。重い挿入が存在する場合、トリガーは機能しません

0
Khan Aamir

探索する価値のあるアプローチは、バッチ処理で更新を行うために サービスブローカーの非同期メカニズム を使用することです更新

Remusは- 非同期プロシージャの実行 について書いています。これは良いスタートを切るか、または service broker-Asynchronous Triggers を使用できます。

0
Kin Shah