Will RID unici mai “troppo pieno”?
-
21-09-2019 - |
Domanda
sto facendo un programma per l'esecuzione su SQL Server e PostgreSQL, quindi mi chiedo questa domanda sulla entrambi.
Che cosa accade ogni volta che si crea una chiave primaria univoca (usando una sequenza o di tipo auto-incremento cosa) e si colpisce più di 4 miliardi di record (32 bit)? Non sto dicendo che il nostro tavolo avrà 4 miliardi di record, ma piuttosto che 4 miliardi di record sono stati creati perché gli unici incrementi RID. Quindi, anche se ho cancellato 3,9 miliardi di questi record, le mie RID sono ancora nel range 4 miliardi. Quindi cosa succede? Lo fa la precisione a 64 bit o lo fa rotolare a 0 o semplicemente sputare un errore molto critica? Dovrei preoccuparmi che anche un po '64 RID può finalmente traboccare anche?
Inoltre, come posso combattere contro questo? C'è una sorta di pulizia opzione o uno strumento? Non mi resta che creare la mia cosa per ogni anno o così completamente ricostruire la tabella per ottenere RID coerenti? (E quindi anche toccare un sacco di altri tavoli che utilizzano questi RID sono le chiavi esterne)
Soluzione
PostgreSQL, per impostazione predefinita, l'errore e non overflow:
# create sequence willyouwrap;
CREATE SEQUENCE
# select setval('willyouwrap', 9223372036854775807);
setval
---------------------
9223372036854775807
(1 row)
# select nextval('willyouwrap');
ERROR: nextval: reached maximum value of sequence "willyouwrap" (9223372036854775807)
Dalla documentazione:
Le sequenze sono basati su aritmetica bigint, quindi l'intervallo non può superare il campo di un numero intero di otto byte (-9223372036854775808 a 9223372036854775807). Su alcune piattaforme più anziani, ci potrebbe essere alcun supporto compilatore per interi a otto byte, in cui le sequenze caso l'uso regolare aritmetica intera (-2147483648 e +2147483647).
Tuttavia, si può rendere ciclo:
L'opzione CYCLE permette alla sequenza di avvolgere intorno quando il maxvalue o minvalue è stato raggiunto da un ascendente o discendente sequenza rispettivamente. Se viene raggiunto il limite, il numero successivo generato sarà rispettivamente minvalue o maxvalue,.
Se non è specificato alcun ciclo, tutte le chiamate alla nextval dopo la sequenza ha raggiunto il suo valore massimo restituirà un errore. Se non sono specificati né CYCLE o NO CYCLE, nessun ciclo è il default.
Non combatterlo. Spendere i byte in più e mantenere le cose semplici. È molto più probabile di rimpiangere l'aggiunta di ulteriori livelli di complessità e / o attività di manutenzione che avere uno spazio delle chiavi più grande.
Altri suggerimenti
In SQL Server: Dipende dal tipo di colonna RID. L'identità interna può aumentare, ma non riuscirà a assegnare alla colonna stoarge:
CREATE TABLE [t1] (
[tid] int IDENTITY (2147483647, 1) NOT NULL
, name varchar(1)
) ON [PRIMARY]
GO
insert into t1(name) values('1')
insert into t1(name) values('1')
questo innesca errore:
Msg 8115, Level 16, State 1, Line 2
Arithmetic overflow error converting IDENTITY to data type int.
Arithmetic overflow occurred.
Ma una colonna numerica con memoria sufficiente incrementerà bene:
CREATE TABLE [t1] (
[tid] numeric(38,0) IDENTITY (2147483647, 1) NOT NULL
, name varchar(1)
) ON [PRIMARY]
GO
insert into t1(name) values('1')
insert into t1(name) values('1')
Allo stesso modo un bigint sarà overlfow a 2 ^^ 63-1:
CREATE TABLE [t1] (
[tid] bigint IDENTITY (9223372036854775807, 1) NOT NULL
, name varchar(1)
) ON [PRIMARY]
GO
insert into t1(name) values('1')
insert into t1(name) values('1')
, ma una colonna numerica con archiviazione sufficiente avrà successo:
CREATE TABLE [t1] (
[tid] numeric(38,0) IDENTITY (9223372036854775807, 1) NOT NULL
, name varchar(1)
) ON [PRIMARY]
GO
insert into t1(name) values('1')
insert into t1(name) values('1')