2017-11-30 1 views
1

私はこれについてできるだけ詳しく説明しようとします。高トランザクション環境で数値の範囲を増やす最も良い方法は何ですか、つまり、呼び出しはWeb APIから非常に速く来ますか?重複のない範囲のSQLインクリメント - マルチスレッド

私が最初に持っているテーブルは、使用可能な範囲のマスターテーブルです。それは以下のとおりです。私はこれがどちらかを実装する最善の方法であるかどうかはわかりませんので、私は提案に開放しています

A社は最初私に100-200の範囲を与えました。時間の経過とともに、私たちは低水準になり始めて、新しい範囲を与えました。新しい範囲は201-300です。

Company Range Inactive 
    A  100-200  X 
    B  100-200 
    C  200-350 
    A  201-300 

第2のテーブルは、範囲間で使用された番号のリストです。

Company Number DateUsed 
    A  198  2017-11-30 
    B  199  2017-11-30 
    A  200  2017-11-30 
    B  105  2017-11-30 
    C  215  2017-11-30 
    A  201  2017-11-30 

範囲が使い果たされたら、私はそれはもう使用されていないので、その範囲外のフラグのことができるように、そして利用できる次の範囲を使用する必要があります。私は、最初のテーブルに "Last Used"の数字を追加して、空の場合は非アクティブにすることを非アクティブにするcase文を含む出力でUpdateステートメントを実行することを考えていました。

私が持っている質問は、高いトランザクション環境でこれを行うための最良の方法は何ですか?私はScope_Identityに精通していますが、この設定ではうまくいかないと思います。

+0

範囲の列を2つの列に分割できますか?たとえば、「RangeLow」と「RangeHigh」です。もしそうなら、この問題をより簡単にするでしょう。リレーショナルデータベースを適切に構築するための重要な機能として、テーブルを「アトミック」にすることもできます。 –

+0

はい、範囲を分割することはprobではありません。それが私がそれを普通にやる方法です。これはほんの一例でした。 –

答えて

0

最初のテーブルにアクティブでないフラグが付いているのは、私にとってはまったく元気です。 Range列が下限列と上限列に分割されている場合、フラグを更新するクエリを作成してテストしました。テーブルRangesRangeLogをそれぞれ呼んでいます。

UPDATE Ranges 
SET Inactive = 'X' 
WHERE EXISTS (SELECT tA.Company, RangeLow, RangeHigh, COUNT(*) 
       FROM Ranges tA INNER JOIN (SELECT DISTINCT Company, Number 
             FROM RangeLog) tB ON tA.Company = tB.Company AND (Number BETWEEN tA.RangeLow AND tA.RangeHigh) 
       GROUP BY tA.Company, RangeLow, RangeHigh 
       HAVING RangeHigh - RangeLow + 1 = COUNT(*) 
        AND Ranges.Company = tA.Company AND Ranges.RangeLow = tA.RangeLow AND Ranges.RangeHigh = tA.RangeHigh) 

明らかにこれは、スキーマで、あなたは今それを持っているように動作しますが、範囲のルックアップ列に分割を行うと、データがより多くの原子・使用可能になり、かつ容易にクエリを書くことはありません。そしてあなたのテーブルにはほんのわずかな変更が加えられています。

これはあなたにどのように見えるか教えてください!

関連する問題