Sequenza vs identità


87

SQL Server 2012 è stato introdotto Sequencecome una nuova funzionalità, come in Oracle e Postgres. Dove le sequenze sono preferite rispetto alle identità? E perché abbiamo bisogno di sequenze?


Dopo aver utilizzato entrambi, preferisco Identity per l'utilizzo globale in un database. Cioè, dove hai bisogno di un numero a incremento automatico come ObjectID e vuoi usarlo su molte tabelle. Diventa complicato creare una sequenza e quindi utilizzare un'applicazione (sito Web o app, ecc.) Per gestire l'inserimento e l'aggiornamento delle tabelle in base a un numero di sequenza.
volume uno

Risposte:


81

Penso che troverai la tua risposta qui

Utilizzando l'attributo identity per una colonna, puoi facilmente generare numeri con incremento automatico (che spesso vengono usati come chiave primaria). Con Sequence, sarà un oggetto diverso che puoi allegare a una colonna della tabella durante l'inserimento. A differenza dell'identità, il numero successivo per il valore della colonna verrà recuperato dalla memoria anziché dal disco: ciò rende Sequence significativamente più veloce di Identity. Lo vedremo nei prossimi esempi.

E qui :

Sequenze: le sequenze sono state richieste dalla community di SQL Server da anni e sono incluse in questa versione. La sequenza è un oggetto definito dall'utente che genera una sequenza di un numero. Ecco un esempio che utilizza Sequence.

e anche qui :

Un oggetto sequenza di SQL Server genera una sequenza di numeri proprio come una colonna Identity nelle tabelle sql. Ma il vantaggio dei numeri di sequenza è che l'oggetto numero di sequenza non è limitato a una singola tabella sql.

e su msdn puoi anche leggere di più sull'utilizzo e perché ne abbiamo bisogno ( qui ):

Una sequenza è un oggetto associato a schema definito dall'utente che genera una sequenza di valori numerici in base alla specifica con cui è stata creata la sequenza. La sequenza di valori numerici viene generata in ordine crescente o decrescente a un intervallo definito e può scorrere (ripetere) come richiesto. Le sequenze, a differenza delle colonne Identity, non sono associate alle tabelle. Un'applicazione fa riferimento a un oggetto sequenza per ricevere il suo valore successivo. La relazione tra sequenze e tabelle è controllata dall'applicazione. Le applicazioni utente possono fare riferimento a un oggetto sequenza e coordinare le chiavi dei valori su più righe e tabelle.

Una sequenza viene creata indipendentemente dalle tabelle utilizzando l'istruzione CREATE SEQUENCE. Le opzioni consentono di controllare l'incremento, i valori massimo e minimo, il punto di partenza, la capacità di riavvio automatico e la memorizzazione nella cache per migliorare le prestazioni. Per informazioni sulle opzioni, vedere CREATE SEQUENCE.

A differenza dei valori delle colonne Identity, che vengono generati quando vengono inserite righe, un'applicazione può ottenere il numero di sequenza successivo prima di inserire la riga chiamando la funzione NEXT VALUE FOR. Il numero di sequenza viene allocato quando viene chiamato NEXT VALUE FOR anche se il numero non viene mai inserito in una tabella. La funzione NEXT VALUE FOR può essere utilizzata come valore predefinito per una colonna in una definizione di tabella. Utilizza sp_sequence_get_range per ottenere un intervallo di più numeri di sequenza contemporaneamente.

Una sequenza può essere definita come qualsiasi tipo di dati intero. Se il tipo di dati non è specificato, una sequenza ha come valore predefinito bigint.


21

Sia la sequenza che l'identità vengono utilizzate per generare il numero automatico, ma la differenza principale è che l'identità dipende dalla tabella e la sequenza è indipendente dalla tabella.

Se hai uno scenario in cui devi mantenere un numero automatico a livello globale (in più tabelle), devi anche riavviare l'intervallo dopo un numero particolare e devi memorizzarlo nella cache anche per le prestazioni, ecco il posto in cui abbiamo bisogno della sequenza e non identità.


14

Sebbene le sequenze forniscano una maggiore flessibilità rispetto alle colonne di identità, non ho riscontrato alcun vantaggio in termini di prestazioni.

Ho riscontrato che le prestazioni utilizzando l'identità erano 3 volte più veloci rispetto all'utilizzo della sequenza per gli inserimenti batch.

Ho inserito circa 1,5 milioni di righe e le prestazioni sono state:

  • 14 secondi per l'identità
  • 45 secondi per la sequenza

Ho inserito le righe in una tabella che utilizzava l'oggetto sequenza tramite una tabella predefinita:

NEXT VALUE for <seq> for <col_name>

e ho anche provato a specificare il valore della sequenza nell'istruzione select:

SELECT NEXT VALUE for <seq>, <other columns> from <table>

Entrambi erano lo stesso fattore più lenti del metodo dell'identità. Ho usato l'opzione cache predefinita per la sequenza.

L'articolo a cui si fa riferimento nel primo collegamento di Arion mostra le prestazioni per l'inserimento riga per riga e la differenza tra identità e sequenza era da 16,6 secondi a 14,3 secondi per 10.000 inserimenti.

L'opzione di memorizzazione nella cache ha un grande impatto sulle prestazioni, ma l'identità è più veloce per volumi più elevati (+ 1 milione di righe)

Vedi questo link per un'analisi approfondita come da commento di utly4life.


Qual era la dimensione della cache della sequenza.
Shannon Severance

50, aumentando fa la differenza, ma ricordo che l'identità era ancora più veloce.
Stagg

2
byobi.com/blog/2012/09/… Fornisce un buon confronto dettagliato di varie configurazioni. Mostra che l'aumento della dimensione della cache da 50 a 500 ha prodotto una differenza di velocità di circa 2x.
ulty4life

1
Stai suggerendo che le sequenze siano più lente della colonna Identity? Ho avuto un'impressione opposta poiché le sequenze sono in memoria a differenza dell'identità che viene recuperata dal disco. Le tue scoperte sono piuttosto sorprendenti. Sono contento che tu abbia condiviso.
RBT

1
con la sequenza è possibile ottimizzare le prestazioni di inserimento batch utilizzando alter sequence increment by ...semplicemente per fare spazio per le nuove righe e quindi utilizzare base + row_number () o qualsiasi altra cosa per i valori effettivi.
Gordy

6

So che questo è un po 'vecchio, ma volevo aggiungere un'osservazione che mi ha colpito.

Sono passato dall'identità alla sequenza per avere i miei indici in ordine. In seguito ho scoperto che la sequenza non si trasferisce con la replica. Ho iniziato a ricevere violazioni chiave dopo aver impostato la replica tra due database poiché le sequenze non erano sincronizzate. solo qualcosa a cui prestare attenzione prima di prendere una decisione.


3

Trovo che l'uso migliore delle sequenze non sia quello di sostituire una colonna di identità ma di creare un campo di tipo "Numero ordine".

In altre parole, un numero d'ordine è esposto all'utente finale e può essere accompagnato da regole di business. Vuoi che sia unico, ma anche il solo utilizzo di una colonna identità non è corretto.

Ad esempio, diversi tipi di ordine potrebbero richiedere una sequenza diversa, quindi potresti avere una sequenza per Ordine Internet, al contrario degli ordini interni.

In altre parole, non pensare a una sequenza come un semplice sostituto dell'identità, considerala utile nei casi in cui un'identità non soddisfa i requisiti aziendali.


1

Recentemente è stato qualcosa da considerare per identità vs sequenza. Sembra che MSFT ora suggerisca la sequenza se si desidera mantenere l'identità senza lacune. Abbiamo avuto un problema in cui c'erano enormi lacune nell'identità, ma sulla base di questa affermazione evidenziata spiegherebbe il nostro problema che SQL ha memorizzato nella cache l'identità e dopo il riavvio abbiamo perso quei numeri.

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql-identity-property?view=sql-server-2017

Valori consecutivi dopo il riavvio del server o altri errori: SQL Server potrebbe memorizzare nella cache i valori di identità per motivi di prestazioni e alcuni dei valori assegnati potrebbero andare persi durante un errore del database o il riavvio del server. Ciò può provocare lacune nel valore di identità al momento dell'inserimento. Se le lacune non sono accettabili, l'applicazione deve utilizzare il proprio meccanismo per generare i valori chiave. L'utilizzo di un generatore di sequenze con l'opzione NOCACHE può limitare gli spazi vuoti alle transazioni che non vengono mai salvate.


1
C'è una risposta abbastanza buona al motivo per cui stai saltando il link deiIDENTITY numeri e ha lo stesso problema del link descritto qui, ma puoi limitarlo impostando una dimensione CACHE più piccola, ma c'è poi un compromesso con la velocità. SEQUENCE
Mrphin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.