2013-07-11 10 views
45

Sto utilizzando il server Sql 2012 (Denali). Mi chiedo semplicemente perché tutti i valori delle colonne identità iniziano da 1001 e così via. All'inizio la colonna Identity inizia da 1,2 e così via e aggiunge identità senza problemi, ma improvvisamente salta a 1001,1002 e in avanti per tutta la tabella nel database contenente la colonna Identity. Quale potrebbe essere la ragione. Si prega di aiutare.Il valore della colonna Identity passa improvvisamente a 1001 nel server sql

+2

Se avete a cuore i valori numerici assegnato a una colonna di identità, stai facendo qualcosa * sbagliato *. È necessario trattare i valori di identità come BLOB opachi che si è appena riusciti a memorizzare nelle colonne 'int' (o altri tipi numerici). –

+0

Sì tipo di dati per tutti quelli che sono 'int' –

risposta

64

Microsoft ha cambiato il modo in cui gestiscono i valori di identità in SQL Server 2012 e, di conseguenza, è possibile visualizzare gli spazi di identità tra i record dopo aver riavviato l'istanza del server SQL o il computer server. Potrebbero esserci altri motivi per questo intervallo di identificazione, potrebbe essere dovuto al riavvio automatico del server dopo l'installazione di un aggiornamento.

causerà un record di log da generare per ogni valore di identità generato È possibile utilizzare sotto due scelte

  • Utilizzare il flag di traccia 272 o Questo. Le prestazioni della generazione dell'identità possono essere influenzate attivando questo flag di tracciamento.
  • utilizzare un generatore di sequenza con l'impostazione

    NO CACHE Impostazione flag di traccia 272 su SQL Server 2012 che vi aspettate qui

  • Open "di SQL Server Configuration Manager"

  • Fare clic su "SQL Server Servizi "nel riquadro sinistro
  • Fare clic con il pulsante destro del mouse sul nome dell'istanza di SQL Server nel riquadro di destra -> Predefinito: SQL Server (MSSQLSERVER)
  • Fare clic su" Proprietà "
  • Clicca "Parametri di avvio"
  • Sul "specificare un parametro di avvio" tipo di testo "-T272"
  • Fare clic su "Aggiungi"
  • confermare le modifiche
+7

+1 per una buona spiegazione. Grazie mille –

+0

Qui di seguito è una citazione da un post di Microsoft risponde a questo problema crisi id su "connect": Se si richiede la stessa semantica generazione identità di precedenti versioni di SQL Server sono disponibili due opzioni disponibili: Usa flag di traccia 272 => Ciò causerà la generazione di un record di log per ogni valore di identità generato. Le prestazioni della generazione dell'identità potrebbero essere influenzate dall'attivazione di questo flag di traccia. –

+0

utilizzare un generatore di sequenza con l'impostazione NO CACHE (http://msdn.microsoft.com/en-us/library/ff878091.aspx) => Ciò causerà un record di registro da generare per ogni valore sequenza generata. Si noti che le prestazioni della generazione del valore di sequenza possono essere influenzate dall'utilizzo di NO CACHE. –

12

Credo che tu abbia la spiegazione in un commento a questo elemento di connessione. Failover or Restart Results in Reseed of Identity

per rilanciare l'preformance per le macchine di fascia alta, si introduce preallocazione per il valore di identità nel 2012. E questa caratteristica può essere disabilitato utilizzando TF 272 (allora si otterrà il comportamento da 2008R2).

Le proprietà dell'identità vengono memorizzate separatamente nei metadati. Se viene utilizzato un valore nell'identità e viene chiamato l'incremento, verrà impostato il nuovo valore di inizializzazione . Nessuna operazione, incluso Rollback, Failover, ... può cambiare il valore di seed eccetto DBCC reseeding. Il failover si applica all'oggetto tabella , ma non all'oggetto identità. Pertanto, per il failover, è possibile eseguire il checkpoint di chiamata prima del failover manuale, ma è possibile che si verifichi un gap per i casi non pianificati . Se gap è un problema, allora io suggerire di utilizzare TF 272.

Per il controllo direttore arresto, abbiamo una soluzione per il prossimo verion (con un'altra TF). Questa correzione si prenderà cura della maggior parte dei casi di arresto del gestore di controllo .

+1

Come evitare questa situazione –

+0

@eraj abilitare TF 272 come descritto in un commento dello stesso articolo di connessione. –

+3

@eraj - come ho detto in un commento alla tua domanda, se * ti preoccupi * dei valori numerici, stai usando 'IDENTITY' errato. –

1

Credo che si potrebbe utilizzare la sequenza, invece, la sequenza si dà il 100% il controllo completo, ed è per molti versi di gran lunga superiori rispetto alle identità ... identità è così dannatamente facile e conveniente

http://msdn.microsoft.com/en-us/library/ff878091.aspx

Per quanto ne so, quando si esegue un inserto con l'identità e non riesce, l'identità viene utilizzato in ogni caso, Verified

con la sequenza si può fare "riempire" le lacune utilizzando ciclo . Anche se, come sottolinea Amy Barrett, questo viene creato al di fuori della portata della transazione.

C'è un ottimizzazione delle prestazioni quando si utilizza la cache che potrebbe essere utile pure.

+0

Solo nel caso qualcun altro sta leggendo questa, la pagina di Microsoft (legato nella tua risposta) dice _ "I numeri di sequenza vengono generati al di fuori del campo di applicazione della transazione corrente, vengono consumati indipendentemente dal fatto che la transazione che utilizza il numero di sequenza sia impegnata o ripristinata. "_ in Note generali, quindi presumo che il numero di sequenza sia utilizzato indipendentemente dall'inserto successo/errore. –

Problemi correlati