0

かなり「アクティブな」CDR テーブルがあり、最後の 5 分間については 5 分ごとにそこからレコードを選択したいと考えています。問題は、他のいくつかの列で生成された SHA ID があるため、必要なレコードの時間ウィンドウを選択するために日付でフィルター処理するタイムスタンプ フィールドだけに頼る必要があることです。

次の問題は、明らかに、スクリプトが毎回正確に秒単位で実行されることを保証できないこと、またはサーバーの壁時計が正確であること (これは問題ではありません) であり、最も重要なのは、ほぼ確実に複数のレコードが存在することです。 1 秒あたり 3 行 '2013-08-08 14:57:05' と言って、2 番目の有効期限が切れる前にもう 1 行挿入される可能性があります。

「2013-08-08 14:57:05」の時間までにレコードを取得BETWEEN '2013-08-08 14:57:05' AND '2013-08-08 15:02:05'すると、見逃していた「2013-08-08 14:57:05」のレコードがさらに存在します。

基本的に:

  • 不正確な壁掛け時計の時間
  • シーケンシャル ID なし
  • 毎秒複数のレコード
  • クエリ実行時間
  • クエリを実行する信頼できない頻度

指定されたローリング タイム ウィンドウで有効な行セットを取得できません。これらを回避する方法について何か提案はありますか?

4

2 に答える 2

0

同じ時計を使用している場合、問題が発生する理由はわかりません。考慮したい解決策は日時テーブルです。そうすれば、サーバー時間に基づいて開始時間と停止時間を更新するたびに....物事が追加されると、その時間枠内にあることが保証されます.

つまり、ハードコーディングによってそれを行うこともできますが、私の方法では、使用するデータベースに開始点と終了点を強制的に格納することになります。

Cron を使用して、間隔とタイミングを多少処理します。それからの時間を使用するのではなく、常にチェックしてデータベースをロックしないようにします。

于 2013-08-08T14:15:35.797 に答える
0

詳細をすべて把握していない可能性がありますが、「一定の時間間隔でデータベーステーブルから確実に選択する」という質問のタイトルに答えるために...

クエリが「正確な」時間で実行されることを期待することさえできないと思います。

このアプローチの重要な問題の 1 つは、同時アクセスとロックに対処しなければならないことです。決まった時間にクエリを送信できるかもしれませんが、DB サーバー上でクエリが数秒間待機している (または、db のかなり古いスナップショットを見て実行されている) 可能性があります。特にあなたの場合、テーブルは明らかに「ビジー」であるためです。


提案として、もし私があなただったら、キューメッセージングシステムについて考えるのに少し時間を費やすでしょう(http://www.rabbitmq.com/のようなものを引用するだけで、それがどういうわけか「あなたの」ソリューションであると予言するのではありません)。とにかく、これらの種類のツールはおそらくあなたのニーズにより適しています。

于 2013-08-08T14:13:05.600 に答える