En esta página, se analizan las estrategias que se pueden usar para generar valores de clave primaria en tu tabla con expresiones de valor predeterminado. 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
:
- Una función de UUID que genera valores de la versión 4 del UUID.
- Un objeto de esquema,
SEQUENCE
, que tiene una opciónbit_reversed_positive
.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 de UUID versión 4 para usar como clave primaria. Los UUID funcionan bien para aplicaciones y tablas nuevas con muchas filas. Se distribuyen de manera uniforme en el espacio de claves, lo que evita la creació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 2.71 × 1018 valores para una probabilidad de colisión del 50%, o bien 1,000 millones por segundo durante 86 años. Esto garantiza valores únicos cuando lo usas 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 sentencia 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 inversión de bits en un contador de Spanner interno y privado para garantizar la unicidad. Los valores con bits invertidos resultantes ayudan a evitar la generación de hotspots a gran escala cuando se usan en una clave primaria.
En Spanner, usas instrucciones DDL SEQUENCE
junto con el atributo bit_reversed_positive
para crear, alterar o descartar una secuencia que produce valores positivos con bits invertidos (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 inversión de bits.
Cuando defines una columna con una expresión DEFAULT
que usa la función GET-NEXT-SEQUENCE-VALUE
de GoogleSQL o la función nextval
de PostgreSQL como valor predeterminado, Spanner llama automáticamente a la función y coloca los valores de salida con bits invertidos en la columna. Las secuencias con inversión de bits son especialmente útiles para las claves primarias, ya que los valores con inversión de bits se distribuyen de manera uniforme en el espacio de claves para que no 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 sentencia muestra un resultado similar al siguiente:
SingerId |
---|
3458764513820540928 |
Situaciones en las que se usan UUID y secuencias como valores predeterminados para claves primarias
Las situaciones para UUIDs y secuencias incluyen las 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, para las aplicaciones nuevas, te recomendamos que uses un identificador único universal (UUID). Para
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 UUIDs en tu base de datos de origen, en Spanner, puedes usar una columna clave en el tipo
STRING
y la funciónGENERATE_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 Cómo migrar columnas de claves con bits invertidos. 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 claves monótonas nuevas 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 Cómo migrar columnas de claves con bits invertidos.
¿Qué sigue?
- Obtén más información para usar 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.