이 페이지에서는 기본값 표현식을 사용하여 테이블의 기본 키 값을 생성하는 데 사용할 수 있는 전략을 설명합니다. 이러한 전략의 이점은 다음과 같습니다.
- 부하 집중 방지
- 다른 데이터베이스에서 마이그레이션 간소화
- 데이터베이스의 키 로직을 캡슐화하여 애플리케이션에서 관리하기 용이함
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에 따라 소문자로 직렬화되는 경우 클라이언트에서 생성된 UUID와 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
속성을 사용하여, 비트 반전 양수 값(GoogleSQL 또는 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 또는GoogleSQL)를 제공합니다. 그렇지 않으면 새 애플리케이션의 경우 범용 고유 식별자(UUID)를 사용하는 것이 좋습니다. 자세한 내용은 범용 고유 식별자(UUID) 사용을 참조하세요.
마이그레이션
테이블을 Spanner로 마이그레이션하는 방법에는 다음과 같은 몇 가지 옵션이 있습니다.
- 소스 데이터베이스에서 UUID를 사용하는 경우 Spanner에서는
STRING
유형의 키 열과GENERATE_UUID()
함수(GoogleSQL 또는PostgreSQL)를 기본 값으로 사용할 수 있습니다. - 정수 기본 키를 사용 중이고 애플리케이션에 고유한 키만 필요한 경우,
INT64
에 키 열을 사용하고 기본 키에 대해 기본값으로 비트 반전 포지티브 시퀀스를 사용할 수 있습니다. 비트 반전 키 열 마이그레이션을 참조하세요. Spanner는 단조 값을 생성하는 방법을 지원하지 않습니다.
PostgreSQL
SERIAL
유형 또는 MySQLAUTO_INCREMENT
속성과 같은 단조 키를 사용 중이고 Spanner에서 새 단조 키가 필요한 경우에는 복합 키를 사용할 수 있습니다. 키 순서 변경 및 고유 키를 해싱하고 쓰기를 논리적 샤드에 분산을 참조하세요.애플리케이션이 GoogleSQL의
INT64
키 또는 PostgreSQL의bigint
키를 수동으로 비트 반전하는 경우 비트 반전 포지티브 시퀀스(GoogleSQL 또는 PostgreSQL)를 사용하고 새 키 값을 생성하게 할 수 있습니다. 비트 반전 키 열 마이그레이션을 참조하세요.
다음 단계
- 세분화된 액세스 제어를 사용한 시퀀스 사용에 대해 자세히 알아보기
- GoogleSQL 또는 PostgreSQL의 DDL
SEQUENCE
문에 대해 알아보기 - GoogleSQL 또는 PostgreSQL의 시퀀스 함수 알아보기
- GoogleSQL 또는 PostgreSQL의 INFORMATION_SCHEMA에 있는 시퀀스 알아보기
- GoogleSQL의 INFORMATION_SCHEMA에서 시퀀스 옵션 알아보기