2012-03-10 10 views
6

SQL AzureフェデレーションがIDENTITYプロパティまたはSEQUENCEをサポートしていないことを考慮すると、レコードを挿入するときに連続番号を生成する効率的な方法はありますか?例えばSQL Azureフェデレーションでシーケンシャル番号を効率的に生成する

、これらのカラムを持つテーブルを与え:

CREATE TABLE [dbo].[Orders] (
    [TenantId] [uniqueidentifier] NOT NULL, 
    [OrderId] [uniqueidentifier] NOT NULL, 
    [OrderNumber] [int] NOT NULL 
    CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED (
     [TenantId] ASC, 
     [OrderId] ASC 
    ) 
) FEDERATED ON ([FederationKey] = [TenantId]) 

所与のテナントのために挿入された各注文のため、OrderIdでインクリメントされるべきです。たとえば、テントAの場合、OrderIdは1,2,3 ...であり、テナントBのOrderIdも1,2,3 ...となります。理想的には、ギャップがないはずです。

TenantIdとOrderIdは主キーのコンポーネントです。それらの値はアプリケーションによって設定され、シーケンス生成の問題には関係しません。 OrderIdだけがビジネス上の意味を持つ連続番号を持っています。また、TenantIdは、連合の配布鍵です。

This MSDN Blog articleは、シーケンスを保持するテーブルを有し、分離されたトランザクション内のストアドプロシージャを使用してシーケンスをインクリメントするアプローチを説明する。各テナントは、シーケンスの最後に使用された値を保持するこのテーブルのレコードを保持します。

これは、スケーラビリティ、競合、リソースロックを考慮した最適なアプローチですか? SQL Azureフェデレーションの制限を考慮して、他の便利なトリックですか?

答えて

2

ここに2つの追加のアイデアがあります。

ビジネスシナリオで可能なことがあれば、このフィールドを非同期にするためのフィールドを個別に更新する方法があります。この方法では、OrderNumberフィールドにNULL値を受け入れる必要があります。どのOrderが最初に来たのかを知るために、正しいOrderNumberを取得するために、InsertedDateフィールドも追加します。冗長性のためにこの作業を実行する複数の作業者ロールがある場合は、非同期処理がより複雑になります。この場合、各プロセスに、自分が作業しているレコードを割り当てる必要があります(OwnedByフィールドも必要です)。各プロセスが独自のレコードで確実に実行されるようにUPDATEし、孤立しないようにプロセスがクラッシュした場合はレコードの割り当てが期限切れになるようにします(AssignedOnフィールドも必要です)。それほど些細なことではありません...

そして、あなたは貧しい人のアプローチをしています。オプティミスティックな並行性アプローチを採用したい場合は、挿入中に次の数値を使用してみてください(指定されたTenantIdとOrderIdのMAX OrderNumberを最初に選択してください)。挿入が失敗した場合(その目的のためにTenantId、OrderNumberに一意索引を追加したため)、OrderNumberに1を追加します。ここでの本当の問題は、再試行の頻度とこのアプローチの可能性が高いことです。比較的合理化されたビジネスプロセスがあれば、これは実際には失敗することはありません。しかし、あなたが複数の道から絶えず追加された注文を持っているなら、これは容認できないアプローチかもしれません。

+0

グレート答え、私は私の質問に引用されたオプションに加えて、 (ストアド・プロシージャを使用して別の接続を使用してレコードを更新する)場合、最初の選択肢は、スケーラビリティとスループットを大幅に向上させますが、第2の選択肢は非常に単純であり、プロセスが合理化されている(例えば、メッセージキューを使用している)場合、または各テナントごとの新規注文作成の割合が高すぎない場合には十分である。 –

2

ないシナリオに合うが、同様に、このを見て、あなたはそれを微調整することができるかどうかを確認するために必要とされるだろうどれだけの労力を確認してください。SnowMaker – a unique id generator for Azure (or any other cloud hosting environment)

+1

これは素晴らしいリソースです。それを私の注意に持ってくれてありがとう。ローカルバッチ処理は非常に効果的で規模が大きく、シーケンスにギャップがあり、時間順に番号が間違っていますが、内部IDではかなり問題はありませんが、ビジネスコントロール番号に適用すると根拠はありません。 –

+0

この方法をお勧めしますか? –

関連する問題