Considerando che le federazioni SQL Azure non supportano la proprietà IDENTITY o SEQUENCE, quale sarebbe un modo efficiente per generare numeri sequenziali durante l'inserimento di record?Modo efficiente di generare numeri sequenziali su federazioni SQL Azure
Ad esempio, data una tabella con queste colonne:
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])
per ogni ordine inserito, per un determinato conduttore, l'OrderId deve essere incrementata. Ad esempio, per un decente A OrderId sarebbe 1, 2, 3 ... e per l'inquilino B OrderId sarebbe anche 1, 2, 3 ... in una sequenza indipendente. Idealmente non dovrebbero esserci lacune.
TenantId e OrderId sono componenti della chiave primaria. I loro valori sono impostati dall'applicazione e non sono correlati al problema della generazione di sequenze; solo OrderId ha il numero sequenziale con significato commerciale. Inoltre, TenantId è la chiave di distribuzione della federazione.
This MSDN Blog article descrive nell'opzione 1 un approccio di avere una tabella contenente le sequenze e l'utilizzo di una stored procedure in una transazione segregata per incrementare le sequenze. Ogni inquilino avrebbe un record su questa tabella tenendo l'ultimo valore utilizzato della sequenza.
Questo sarebbe l'approccio ottimale considerando scalabilità, contesa, blocco delle risorse? Qualche altro trucco utile, considerando i limiti delle federazioni SQL Azure?
Grande risposta, oltre alla possibilità che ho citato nella mia interrogazione (utilizzando una procedura memorizzata per aggiornare un record utilizzando una connessione separata), la prima alternativa offre un'eccezionale scalabilità e throughput al costo di una certa complessità; la seconda alternativa è abbastanza semplice e potrebbe essere sufficiente quando il processo è semplificato (ad esempio utilizzando una coda di messaggi) o quando il tasso di creazione di nuovi ordini per ciascun tenant non è troppo alto. –