Administración de valores predeterminados de la clave primaria

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:

  • Una función de UUID que genera valores de la versión 4 del UUID.
  • Un objeto de esquema, SEQUENCE, que tiene un bit_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 GoogleSQL. o de 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 declaraciones 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 Para obtener más información, consulta Usa un identificador único universal (UUID).

Migraciones

Para las migraciones de tablas a Spanner, tienes algunas opciones:

¿Qué sigue?