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