Biorąc pod uwagę, że SQL Azure Federations nie obsługuje właściwości IDENTITY lub SEQUENCE, jaki byłby skuteczny sposób generowania kolejnych numerów podczas wstawiania rekordów?Wydajny sposób generowania liczb sekwencyjnych w federacjach SQL Azure
Na przykład, biorąc pod uwagę tabelę z tych kolumn:
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])
dla każdego zamówienia włożonej danego lokatora OrderID powinna być zwiększona. Na przykład dla namiotu A OrderId będzie 1, 2, 3 ... a dla najemcy B OrderId będzie również 1, 2, 3 ... w niezależnej sekwencji. Idealnie nie powinno być żadnych luk.
TenantId i OrderId są składowymi klucza podstawowego. Ich wartości są ustalane przez aplikację i nie są związane z kwestią generowania sekwencji; tylko OrderId ma numer kolejny o znaczeniu biznesowym. Ponadto TenantId jest kluczem dystrybucyjnym federacji.
This MSDN Blog article opisuje w opcji 1 podejście polegające na posiadaniu tabeli zawierającej sekwencje i stosowaniu procedury przechowywanej w segregowanej transakcji w celu zwiększenia sekwencji. Każdy lokator miałby rekord na tej tabeli zawierający ostatnią używaną wartość sekwencji.
Czy byłoby to optymalne podejście, biorąc pod uwagę skalowalność, rywalizację, blokowanie zasobów? Jakieś inne przydatne sztuczki, biorąc pod uwagę ograniczenia federacji SQL Azure?
Wielką odpowiedź, oprócz opcji przytoczyłem w moim pytaniu (przy użyciu procedury przechowywanej, aby zaktualizować rekord przy użyciu oddzielnego połączenia), pierwsza alternatywa zapewnia dużą skalowalność i przepustowość kosztem pewnej złożoności; druga alternatywa jest dość prosta i może wystarczyć, gdy proces zostanie usprawniony (np. za pomocą kolejki komunikatów) lub gdy tempo tworzenia nowych zamówień dla każdego lokatora nie jest zbyt wysokie. –