Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Database SQL di Windows Azure - La colonna di incremento automatico dell'identità ignora i valori

Potresti essere sfortunato qui se devi eliminare queste lacune.

Ho riscontrato questo problema da solo mentre sto sviluppando/testando una nuova applicazione. Sto intuendo cosa sta succedendo qui in sql azure in base a ciò che ho letto su sql server 2012. Non sono stato in grado di trovare alcuna documentazione su questo per sql azure.

Da quello che ho letto, questa è una funzionalità che si presenta come un bug IMO. In SQL Server 2012 Microsoft ha aggiunto la possibilità di creare sequenze. Le sequenze registrano quali valori sono stati utilizzati in blocchi di 1000. Quindi diciamo che la tua sequenza stava progredendo... 1, 2, 3, 4, 5... e poi il tuo server sql si riavvia. Bene, la sequenza ha già salvato il fatto che il blocco 1-1000 è già stato utilizzato, quindi ti salta al 1000 successivo.... quindi il tuo prossimo valore è 1001, 1002, 1003, 1004.... Questo migliora le prestazioni di inserti quando si utilizzano sequenze, ma possono causare lacune insolite. C'è una soluzione a questo per la tua sequenza. Quando si specifica la sequenza, aggiungere il parametro "NOCACHE" in modo che non salvi blocchi di 1000 alla volta. Vedi qui per ulteriore documentazione.

Dove questo diventa un problema è che le colonne Identity sembrano essere state modificate per utilizzare questo stesso paradigma. Quindi, quando il tuo server, o in questo caso la tua istanza sql azure, si riavvia, puoi ottenere grandi lacune (1000) nelle colonne di identità perché sta memorizzando nella cache blocchi di grandi dimensioni come "usati". Esiste una soluzione a questo per sql server 2012. È possibile specificare un flag di avvio t272 per ripristinare la propria identità utilizzando il vecchio paradigma sql server 2008 r2. Il problema è che non sono a conoscenza (potrebbe non essere possibile) di come specificarlo in sql Azure. Impossibile trovare la documentazione. Vedi questo thread per maggiori dettagli su sql server 2012.

Controlla la documentazione dell'identità qui nel msdn. In particolare la sezione "Valori consecutivi dopo il riavvio del server o altri guasti". Ecco cosa dice:

Quindi, se hai bisogno di avere valori consecutivi, puoi provare a specificare una sequenza con nocache invece di fare affidamento sulla tua colonna di identità. Non l'ho provato io stesso, ma sembra che avrai problemi a farlo funzionare con il framework di entità.

Scusa se questo non aiuta molto, ma almeno sono alcune informazioni su ciò che stai vivendo.