In questa pagina vengono descritte le strategie da utilizzare per generare valori di chiave primaria nella tabella utilizzando le espressioni di valori predefiniti. Queste strategie hanno i seguenti vantaggi:
- Impedisci hotspot
- Semplifica le migrazioni da altri database
- Incapsulare la logica chiave nel database in modo da non doverti preoccupare di gestirla nell'applicazione
Puoi utilizzare le seguenti strategie in una colonna con DEFAULT
espressioni:
- Una funzione UUID che genera valori UUID versione 4.
- Un oggetto schema,
SEQUENCE
, che ha un'opzionebit_reversed_positive
.SEQUENCE
è disponibile sia per GoogleSQL che per PostgreSQL.
Metodi per generare automaticamente chiavi primarie
UUID (Universally Unique Identifier)
Spanner può generare automaticamente una stringa UUID versione 4 da utilizzare come chiave primaria. Gli UUID sono ideali per nuove applicazioni e tabelle con molte righe. Sono distribuiti in modo approssimativamente uniforme nello spazio chiave, impedendo così l'hotspoting su larga scala. La generazione di UUID può creare un numero elevato di valori (2122) e ogni valore è effettivamente univoco. Ad esempio, sono necessari valori di 2, 71 × 1018 per una probabilità di collisione del 50% o 1 miliardo al secondo per 86 anni. Ciò garantisce valori univoci quando vengono utilizzati in tabelle di grandi dimensioni. Gli UUID sono univoci sia che vengano generati nel database sia nel client. Se possibile, ti consigliamo di utilizzare gli UUID. Puoi combinare in modo sicuro UUID generati da client e Spanner nella stessa tabella se gli UUID generati dal client sono serializzati come lettere minuscole, in conformità a RFC 4122.
Per una colonna che richiede valori predefiniti, puoi utilizzare la funzione GENERATE_UUID
per generarli. L'esempio seguente mostra come creare una tabella in cui la colonna della chiave FanId
ha GENERATE_UUID
nella colonna dei valori come valore predefinito. L'esempio utilizza 36 caratteri per gli attributi GoogleSQL
STRING
e PostgreSQL varchar
perché gli UUID hanno 36 caratteri.
Quando utilizzi l'istruzione INSERT with THEN RETURN
per l'inserimento nella tabella Fans
, GENERATE_UUID
genera e restituisce un valore UUID per FanId
.
GoogleSQL
CREATE TABLE Fans (
FanId STRING(36) DEFAULT (GENERATE_UUID()),
Name STRING(MAX),
) PRIMARY KEY (FanId);
PostgreSQL
CREATE TABLE Fans (
FanId varchar(36) DEFAULT spanner.generate_uuid(),
Name text,
PRIMARY KEY (FanId)
);
GoogleSQL
INSERT INTO Fans (Name) VALUES ('Melissa Garcia')
THEN RETURN FanId;
PostgreSQL
INSERT INTO fans (name) VALUES ('Melissa Garcia')
RETURNING (fanid);
Questa istruzione restituisce un risultato simile al seguente:
FanId |
---|
6af91072-f009-4c15-8c42-ebe38ae83751 |
Per ulteriori informazioni sulla funzione GENERATE_UUID()
, consulta la pagina di riferimento di GoogleSQL o PostgreSQL.
Sequenza invertita di bit
Una sequenza con inversione in bit è un oggetto schema che produce una sequenza di numeri interi e li inverti bit. Questo oggetto utilizza l'inversione dei bit su un contatore Spanner interno privato per garantire l'unicità. I valori invertiti in bit risultanti aiutano a evitare l'hotspot su larga scala quando vengono utilizzati in una chiave primaria.
In Spanner, utilizzi le istruzioni DDL SEQUENCE
insieme all'attributo bit_reversed_positive
per creare, modificare o eliminare una sequenza che produce valori positivi invertiti in bit (GoogleSQL o PostgreSQL).
Ogni sequenza gestisce un insieme di contatori interni e li utilizza per generare un valore. Il contatore di sequenza fornisce l'input all'algoritmo con inversione dei bit.
Quando definisci una colonna con un'espressione DEFAULT
che utilizza la funzione GoogleSQL
GET-NEXT-SEQUENCE-VALUE
o
PostgreSQL nextval
come valore predefinito, Spanner chiama automaticamente la funzione e inserisce nella colonna i valori di output con invertire i bit. Le sequenze invertite a bit sono particolarmente utili per le chiavi primarie, perché i valori invertiti vengono distribuiti uniformemente nello spazio delle chiavi in modo che non causino hotspot.
L'esempio seguente mostra come creare una sequenza invertita con i bit e una tabella in cui la colonna della chiave utilizza la sequenza come valore predefinito:
GoogleSQL
CREATE SEQUENCE SingerIdSequence OPTIONS (
sequence_kind="bit_reversed_positive"
);
CREATE TABLE Singers (
SingerId INT64 DEFAULT (GET_NEXT_SEQUENCE_VALUE(SEQUENCE SingerIdSequence)),
Name STRING(MAX),
Rank INT64,
) PRIMARY KEY (SingerId);
PostgreSQL
CREATE SEQUENCE SingerIdSequence bit_reversed_positive;
CREATE TABLE Singers (
SingerId bigint DEFAULT nextval('SingerIdSequence'),
Name text,
PRIMARY KEY (SingerId)
);
Puoi quindi utilizzare la seguente istruzione SQL per inserire e restituire il valore della chiave primaria:
GoogleSQL
INSERT INTO Singers (Name) VALUES ('Melissa Garcia')
THEN RETURN SingerId;
PostgreSQL
INSERT INTO Singers (name) VALUES ('Melissa Garcia')
RETURNING (SingerId);
Questa istruzione restituisce un risultato simile al seguente:
SingerId |
---|
3458764513820540928 |
Scenari per l'utilizzo di UUID e sequenze come valori predefiniti per le chiavi primarie
Gli scenari per gli UUID e le sequenze includono i seguenti:
- Nuove applicazioni
- Migrazioni
Le sezioni seguenti descrivono ogni scenario.
Nuove applicazioni
Se l'applicazione esistente richiede chiavi INT64
in GoogleSQL o chiavi bigint
in PostgreSQL, Spanner offre l'oggetto schema della sequenza positiva con inversione di bit (PostgreSQL o GoogleSQL). In caso contrario, per le nuove
applicazioni, ti consigliamo di utilizzare l'UUID (Universally Unique Identifier). Per
ulteriori informazioni, vedi Utilizzare un UUID (Universally Unique Identifier).
Migrazioni
Per le migrazioni delle tabelle a Spanner, hai a disposizione alcune opzioni:
- Se utilizzi gli UUID nel database di origine, su Spanner puoi utilizzare una colonna chiave nel tipo
STRING
e la funzioneGENERATE_UUID()
(GoogleSQL o PostgreSQL) come valore predefinito. - Se utilizzi una chiave primaria intera e la tua applicazione richiede che la chiave sia univoca, puoi utilizzare una colonna di chiave in
INT64
e utilizzare una sequenza positiva con inversione di bit per il valore predefinito della chiave primaria. Consulta Migrazione delle colonne delle chiavi con inversione di bit. Spanner non supporta un modo per generare valori monotonici.
Se utilizzi una chiave monotonica, come il tipo PostgreSQL
SERIAL
o l'attributo MySQLAUTO_INCREMENT
, e hai bisogno di nuove chiavi monotoniche in Spanner, puoi utilizzare una chiave composita. Consulta Scambia l'ordine delle chiavi e Esegui l'hashing della chiave univoca e distribuisci le scritture sugli shard logici.Se la tua applicazione esegue manualmente l'inversione di bit della chiave
INT64
in GoogleSQL obigint
in PostgreSQL, puoi utilizzare una sequenza positiva con inversione di bit (GoogleSQL o PostgreSQL) e fare in modo che generi nuovi valori chiave per te. Consulta Migrazione delle colonne delle chiavi con inversione di bit.
Passaggi successivi
- Scopri di più sull'utilizzo delle sequenze con controllo dell'accesso granulare.
- Scopri di più sulle istruzioni DDL
SEQUENCE
per GoogleSQL o PostgreSQL. - Scopri di più sulle funzioni sequenza in GoogleSQL o PostgreSQL.
- Scopri di più sulle sequenze in INFORMATION_SCHEMA in GoogleSQL o PostgreSQL.
- Scopri di più sulle opzioni di sequenza in INFORMATION_SCHEMA per GoogleSQL.