En esta página, se analizan estrategias que se pueden usar para generar valores de clave primaria en tu con expresiones de valores predeterminados. Estas estrategias tienen las siguientes características: beneficios:
- Cómo evitar la generación de hotspots
- Simplifica las migraciones desde otras bases de datos
- Encapsula la lógica de la clave en la base de datos para que no tengas que preocuparte. sobre cómo administrarla en tu aplicación
Puedes usar las siguientes estrategias en una columna que tenga expresiones DEFAULT
:
- Es una función UUID que genera valores de UUID de versión 4.
- Un objeto de esquema,
SEQUENCE
, que tiene unbit_reversed_positive
de 12 a 1 con la nueva opción de compresión.SEQUENCE
está disponible para GoogleSQL y PostgreSQL.
Métodos para generar claves primarias automáticamente
Identificador único universal (UUID)
Spanner puede generar automáticamente una cadena versión 4 de UUID para usarla como clave primaria. Los UUID funcionan bien para nuevas aplicaciones y tablas con muchas filas. Se distribuyen de manera aproximadamente uniforme en el espacio clave, evita la generación de hotspots a gran escala. UUID de salida puede crear una gran cantidad de valores (2122) y cada valor es efectivamente único. Por ejemplo, necesitarías Valores de 2.71 × 1018 para una probabilidad de colisión del 50% 1,000 millones por segundo durante 86 años. Esto garantiza valores únicos cuando lo usas en en tablas grandes. Los UUID son únicos, ya sea que los generes en la base de datos o en la cliente. Te recomendamos que uses UUID siempre que sea posible. Puedes mezclar de forma segura UUID generados por el cliente y por Spanner en la misma tabla si los UUID generados por el cliente se serializan en minúsculas, de acuerdo con RFC 4122
Para una columna que necesita valores predeterminados, puedes usar GENERATE_UUID
para generarlos. En el siguiente ejemplo, se muestra cómo crear
una tabla en la que la columna de clave FanId
tiene GENERATE_UUID
en el valor
como valor predeterminado. En el ejemplo, se usan 36 caracteres para el lenguaje
Los atributos STRING
y varchar
de PostgreSQL porque los UUID tienen 36 caracteres
Cuando usas la sentencia INSERT with THEN RETURN
para insertarla en
Fans
, GENERATE_UUID
genera y muestra un valor de UUID para 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);
Esta declaración muestra un resultado similar al siguiente:
FanId |
---|
6af91072-f009-4c15-8c42-ebe38ae83751 |
Para obtener más información sobre la función GENERATE_UUID()
, consulta la página de referencia de GoogleSQL o PostgreSQL.
Secuencia de bits inversa
Una secuencia de bits invertido es un objeto de esquema que produce una secuencia de enteros y los revierte sus bits. Este objeto usa la reversión de bits en un contenedor un contador interno de Spanner para garantizar la unicidad. El resultado valores invertidos de bits ayuda a evitar la generación de hotspots a gran escala cuando se usa en una clave primaria.
En Spanner, debes usar sentencias DDL SEQUENCE
junto con el
el atributo bit_reversed_positive
para crear, modificar o descartar
que produce valores positivos invertidos en los bits (GoogleSQL o
PostgreSQL).
Cada secuencia mantiene un conjunto de contadores internos y los usa para generar un valor. El contador de secuencias proporciona la entrada al algoritmo de reversión de bits.
Cuando defines una columna con una expresión DEFAULT
que usa el SQL de Google
GET-NEXT-SEQUENCE-VALUE
o el
la función nextval
de PostgreSQL como valor predeterminado, Spanner
automáticamente llama a la función y coloca los bits de los valores de salida
la columna. Las secuencias invertidas de bits son especialmente útiles para las claves primarias
porque los valores invertidos en los bits se distribuyen de manera uniforme en la clave.
para que no se generen hotspots.
En el siguiente ejemplo, se muestra cómo crear una secuencia con inversión de bits y una tabla en el que su columna de clave usa la secuencia como valor predeterminado:
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)
);
Luego, puedes usar la siguiente instrucción de SQL para insertar y mostrar la instancia par clave-valor:
GoogleSQL
INSERT INTO Singers (Name) VALUES ('Melissa Garcia')
THEN RETURN SingerId;
PostgreSQL
INSERT INTO Singers (name) VALUES ('Melissa Garcia')
RETURNING (SingerId);
Esta declaración muestra un resultado similar al siguiente:
SingerId |
---|
3458764513820540928 |
Situaciones en las que se usan UUID y secuencias como valores predeterminados para claves primarias
Los casos de UUID y secuencias incluyen los siguientes:
- Aplicaciones nuevas
- Migraciones
En las siguientes secciones, se describe cada situación.
Aplicaciones nuevas
Si tu aplicación existente requiere claves INT64
en GoogleSQL o bigint
en PostgreSQL, Spanner ofrece la inversión de bits positiva
objeto de esquema de secuencia (PostgreSQL o GoogleSQL). De lo contrario, si los archivos
aplicaciones, te recomendamos que utilices
Identificador único universal (UUID). Para obtener más información, consulta Usa un identificador único universal (UUID).
Migraciones
Para las migraciones de tablas a Spanner, tienes algunas opciones:
- Si usas UUID en tu base de datos de origen, en Spanner,
puedes usar una columna de clave en el tipo
STRING
y elGENERATE_UUID()
(GoogleSQL o PostgreSQL) como su valor predeterminado. - Si usas una clave primaria de número entero y tu aplicación solo necesita la
para que la clave sea única, puedes usar una columna de clave en
INT64
y usar la reversión de bits positiva para el valor predeterminado de la clave primaria. Consulta Migra columnas de clave con inversión de bits. Spanner no admite una forma de generar valores monótonos.
Si usas una clave monótona, como el tipo
SERIAL
de PostgreSQL, o el atributoAUTO_INCREMENT
de MySQL, y necesitas nuevas claves monótonas en Spanner, puedes usar una clave compuesta. Consulta Cambia el orden de las claves, Genera un hash de la clave única y distribuye las escrituras entre fragmentos lógicos.Si tu aplicación revierte manualmente los bits de tu clave
INT64
en GoogleSQL obigint
en PostgreSQL, puedes usar una secuencia positiva inversa de bits (GoogleSQL o PostgreSQL) y que genere nuevos pares clave-valor para ti. Consulta Migra columnas de clave con inversión de bits.
¿Qué sigue?
- Obtén más información sobre el uso de secuencias con control de acceso detallado.
- Obtén información sobre las instrucciones
SEQUENCE
de DDL para GoogleSQL o PostgreSQL. - Obtén más información sobre las funciones de secuencia en GoogleSQL o PostgreSQL.
- Obtén información sobre secuencias en INFORMATION_SCHEMA en GoogleSQL o PostgreSQL.
- Obtén información sobre las opciones de secuencia en INFORMATION_SCHEMA para GoogleSQL.