기본 키 기본값 관리

이 페이지에서는 기본값 표현식을 사용하여 테이블에서 기본 키 값을 생성하는 데 사용하는 전략에 대해 설명합니다. 이러한 전략에는 다음과 같은 이점이 있습니다.

  • 부하 집중 방지
  • 다른 데이터베이스에서의 마이그레이션 간소화
  • 데이터베이스의 키 로직을 캡슐화하여 애플리케이션에서 관리하기 용이함

DEFAULT 표현식이 있는 열에서 다음 전략을 사용할 수 있습니다.

  • UUID 버전 4 값을 생성하는 UUID 함수
  • bit_reversed_positive 옵션이 있는 스키마 객체 SEQUENCE SEQUENCE는 GoogleSQL과 PostgreSQL 모두에 사용할 수 있습니다.

기본 키를 자동으로 생성하는 방법

UUID(범용 고유 식별자)

Spanner는 기본 키로 사용할 UUID 버전 4 문자열을 자동으로 생성할 수 있습니다. UUID는 행이 많은 새 애플리케이션과 테이블에 적합합니다. 키스페이스 전체에 대략적으로 균일하게 분산되어 대규모 부하 집중을 방지합니다. UUID 생성은 많은 수의 값(2122)을 만들 수 있으며, 각 값은 사실상 고유합니다. 예를 들어 충돌 가능성이 50%인 경우 2.71×1018 값이 필요하거나, 86년 동안 초당 10억 개의 값이 필요합니다. 이렇게 하면 큰 테이블에서 사용할 때 고유한 값이 보장됩니다. UUID는 데이터베이스 또는 클라이언트에서 생성하는지 여부에 관계없이 고유합니다. 가능한 경우 UUID를 사용하는 것이 좋습니다. 클라이언트 생성 UUID가 RFC 4122에 따라 소문자로 직렬화되는 경우 클라이언트 및 Spanner에서 생성된 UUID를 동일한 테이블에 안전하게 혼합할 수 있습니다.

기본값이 필요한 열의 경우 GENERATE_UUID 함수를 사용하여 이를 생성할 수 있습니다. 다음 예시에서는 FanId 키 열의 값 열에 GENERATE_UUID가 기본값으로 있는 테이블을 만드는 방법을 보여줍니다. 이 예시에서는 UUID에 36자가 있으므로 GoogleSQL STRING 및 PostgreSQL varchar 속성에 36자를 사용합니다. INSERT with THEN RETURN 문을 사용하여 Fans 테이블에 삽입하면 GENERATE_UUID에서 FanId의 UUID 값을 생성하고 반환합니다.

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);

이 문은 다음과 유사한 결과를 반환합니다.

FanId
6af91072-f009-4c15-8c42-ebe38ae83751

GENERATE_UUID() 함수에 대한 자세한 내용은 GoogleSQL 또는 PostgreSQL 참조 페이지를 확인하세요.

비트 반전 시퀀스

비트 반전 시퀀스는 정수 시퀀스를 생성하고 비트 반전을 수행하는 스키마 객체입니다. 이 객체는 비공개 내부 Spanner 카운터에서 비트 반전을 사용하여 고유성을 보장합니다. 결과 비트 반전 값을 사용하면 기본 키에 사용될 때 대규모 부하 집중을 방지할 수 있습니다.

Spanner에서는 SEQUENCE DDL 문과 함께 bit_reversed_positive 속성을 사용하여, 비트 반전 양수 값(Google SQL 또는 PostgreSQL)을 생성하는 시퀀스를 생성, 변경, 또는 삭제합니다.

각 시퀀스는 내부 카운터 집합을 유지하고 값을 생성합니다. 시퀀스 카운터는 비트 반전 알고리즘에 입력을 제공합니다.

GoogleSQL GET-NEXT-SEQUENCE-VALUE 또는 PostgreSQL nextval 함수를 기본값으로 사용하는 DEFAULT 표현식으로 열을 정의하면 Spanner는 함수를 자동으로 호출하고 출력 값이 비트 반전될 수 있습니다. 비트 반전 시퀀스는 부하 집중을 일으키지 않도록 키 공간에 균일하게 분산되기 때문에 기본 키에 특히 유용합니다.

다음 예시에서는 비트 반전 시퀀스를 만드는 방법과 키 열이 시퀀스를 기본값으로 사용하는 테이블을 만드는 방법을 보여줍니다.

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)
);

그런 후 다음 SQL 문을 사용하여 기본 키 값을 삽입하고 반환할 수 있습니다.

GoogleSQL

INSERT INTO Singers (Name) VALUES ('Melissa Garcia')
THEN RETURN SingerId;

PostgreSQL

INSERT INTO Singers (name) VALUES ('Melissa Garcia')
RETURNING (SingerId);

이 문은 다음과 유사한 결과를 반환합니다.

SingerId
3458764513820540928

UUID 및 시퀀스를 기본 키의 기본값으로 사용하는 시나리오

UUID 및 시퀀스의 시나리오는 다음과 같습니다.

  • 새 애플리케이션
  • 마이그레이션

다음 섹션에서는 각 시나리오를 설명합니다.

새 애플리케이션

기존 애플리케이션이 GoogleSQL에서는 INT64 키, PostgreSQL에서는 bigint 키를 요구하는 경우, Spanner는 비트 반전 양수 시퀀스 스키마 객체 (PostgreSQL 또는Google SQL)를 제공합니다. 그렇지 않으면 새 애플리케이션의 경우 범용 고유 식별자(UUID)를 사용하는 것이 좋습니다. 자세한 내용은 범용 고유 식별자(UUID) 사용을 참조하세요.

마이그레이션

테이블을 Spanner로 마이그레이션할 때는 몇 가지 옵션을 사용할 수 있습니다.

  • 소스 데이터베이스에서 UUID를 사용하는 경우 Spanner에서는 STRING 유형의 키 열과 GENERATE_UUID() 함수(Google SQL 또는PostgreSQL)를 기본 값으로 사용할 수 있습니다.
  • 정수 기본 키를 사용 중이고 애플리케이션에 고유한 키만 필요한 경우, INT64에 키 열을 사용하고 기본 키에 대해 기본값으로 비트 반전 포지티브 시퀀스를 사용할 수 있습니다. 비트 반전 키 열 마이그레이션을 참조하세요.
  • Spanner는 단조값을 생성하는 방법을 지원하지 않습니다.

    PostgreSQL SERIAL 유형 또는 MySQL AUTO_INCREMENT 속성과 같은 단조 키를 사용 중이고 Spanner에서 새 단조 키가 필요한 경우에는 복합 키를 사용할 수 있습니다. 키 순서 바꾸기고유 키 해시 및 여러 논리 분할에 쓰기 분산을 참조하세요.

  • 애플리케이션이 GoogleSQL의 INT64 키 또는 PostgreSQL의 bigint 키를 수동으로 비트 반전하는 경우 비트 반전 포지티브 시퀀스(GoogleSQL 또는 PostgreSQL)를 사용하고 새 키 값을 생성하게 할 수 있습니다. 비트 반전 키 열 마이그레이션을 참조하세요.

다음 단계