CREATE SEQUENCE - Amazon Aurora DSQL

CREATE SEQUENCE

CREATE SEQUENCE - 새 시퀀스 생성기를 정의합니다.

중요

PostgreSQL에서 CACHE 지정은 선택 사항이며 기본값은 1입니다. Amazon Aurora DSQL과 같은 분산 시스템에서 시퀀스 작업은 조정을 포함하며, 캐시 크기가 1이면 동시성이 높을 때 조정 오버헤드가 증가할 수 있습니다. 캐시 값이 크면 로컬에 미리 할당된 범위에서 시퀀스 번호를 제공할 수 있으므로, 처리량이 향상되고 사용하지 않는 예약 값이 손실되어 간격과 순서 지정 효과를 더 명확하게 확인할 수 있습니다. 애플리케이션마다 할당 순서와 처리량에 대한 민감도가 다르기 때문에 Amazon Aurora DSQL은 CACHE를 명시적으로 지정하도록 요구하며, 현재 CACHE = 1 또는 CACHE >= 65536을 지원하므로 엄격한 순차 생성에 더 가까운 할당 동작과 높은 동시성 워크로드에 최적화된 할당을 명확히 구분하도록 해 줍니다.

CACHE >= 65536인 경우 시퀀스 값은 고유하게 유지되지만 세션 간에 엄격하게 증가하는 순서로 생성되지 않을 수 있으며, 특히 캐시된 값이 완전히 사용되지 않는 경우 간격이 발생할 수 있습니다. 이러한 특성은 동시 사용 시 캐시된 시퀀스에 대한 PostgreSQL 의미 체계와 일치하며, 두 시스템 모두 고유한 값을 보장하지만 세션 간에 엄격하게 순차적인 순서 지정을 보장하지는 않습니다.

단일 클라이언트 세션 내에서 시퀀스 값은 특히 명시적 트랜잭션 외부에서 항상 엄격하게 증가하는 것처럼 보이지 않을 수 있습니다. 이 동작은 연결 풀링을 사용하는 PostgreSQL 배포와 유사합니다. 단일 세션 PostgreSQL 환경에 더 가까운 할당 동작은 CACHE = 1을 사용하거나 명시적 트랜잭션 내에서 시퀀스 값을 가져와 달성할 수 있습니다.

CACHE = 1을 사용하면 시퀀스 할당이 PostgreSQL의 캐시되지 않은 시퀀스 동작을 따릅니다.

워크로드 패턴을 기반으로 시퀀스를 가장 잘 사용하는 방법에 대한 지침은 시퀀스 및 자격 증명 열 작업 섹션을 참조하세요.

지원되는 구문

CREATE SEQUENCE [ IF NOT EXISTS ] name CACHE cache [ AS data_type ] [ INCREMENT [ BY ] increment ] [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ] [ [ NO ] CYCLE ] [ START [ WITH ] start ] [ OWNED BY { table_name.column_name | NONE } ] where data_type is BIGINT and cache = 1 or cache >= 65536

설명

CREATE SEQUENCE는 새 시퀀스 번호 생성기를 생성합니다. 여기에는 이름이 name인 새 특수 단일 행 테이블을 생성하고 초기화하는 작업이 포함됩니다. 명령을 실행하는 사용자가 생성기를 소유합니다.

스키마 이름이 제공되면 지정된 스키마에 시퀀스가 ​​생성됩니다. 그러지 않으면 현재 스키마에서 생성됩니다. 시퀀스 이름은 동일한 스키마 내의 다른 관계(테이블, 시퀀스, 인덱스, 뷰, 구체화된 뷰 또는 외부 테이블)의 이름과 달라야 합니다.

시퀀스가 생성되면 함수 nextval, currvalsetval을 사용하여 시퀀스에서 작업합니다. 이러한 함수는 시퀀스 조작 함수에 설명되어 있습니다.

시퀀스를 직접 업데이트할 수는 없지만 다음과 같은 쿼리를 사용할 수 있습니다.

SELECT * FROM name;

시퀀스의 일부 파라미터와 현재 상태를 검사합니다. 특히 시퀀스의 last_value 필드에는 세션에서 할당한 마지막 값이 표시됩니다. (물론 다른 세션이 적극적으로 nextval 직접 호출을 수행하는 경우 이 값은 출력되는 시점에 더 이상 사용되지 않을 수 있습니다.) pg_sequences 뷰에서 incrementmaxvalue와 같은 다른 파라미터를 관찰할 수 있습니다.

파라미터

IF NOT EXISTS

동일한 이름의 관계가 이미 있는 경우 오류를 발생시키지 않습니다. 이 경우 알림이 발행됩니다. 기존 관계가 생성되었을 시퀀스와 비슷하다는 보장은 없으며 시퀀스가 아닐 수도 있습니다.

이름

생성할 시퀀스의 이름(선택적으로 스키마 한정자 포함)입니다.

data_type

선택적 절 AS data_type은 시퀀스의 데이터 형식을 지정합니다. 유효한 값은 bigint이며, bigint가 기본값입니다. 데이터 형식에 따라 시퀀스의 기본 최솟값과 최댓값이 결정됩니다.

increment

선택적 절 INCREMENT BY increment은 새 값을 생성하기 위해 현재 시퀀스 값에 추가할 값을 지정합니다. 양수 값은 오름차순 시퀀스를 만들고, 음수 값은 내림차순 시퀀스를 만듭니다. 기본값은 1입니다.

minvalue / NO MINVALUE

선택적 절 MINVALUE minvalue는 시퀀스가 생성할 수 있는 최솟값을 결정합니다. 이 절이 제공되지 않거나 NO MINVALUE가 지정된 경우 기본값이 사용됩니다. 오름차순 시퀀스의 기본값은 1입니다. 내림차순 시퀀스의 기본값은 데이터 형식의 최솟값입니다.

maxvalue / NO MAXVALUE

선택적 절 MAXVALUE maxvalue는 시퀀스의 최댓값을 결정합니다. 이 절이 제공되지 않거나 NO MAXVALUE가 지정된 경우 기본값이 사용됩니다. 오름차순 시퀀스의 기본값은 데이터 형식의 최댓값입니다. 내림차순 시퀀스의 기본값은 -1입니다.

CYCLE / NO CYCLE

CYCLE 옵션을 사용하면 각각 오름차순 또는 내림차순 시퀀스에 의해 maxvalue 또는 minvalue에 도달했을 때 시퀀스를 래핑할 수 있습니다. 한도에 도달하면 생성되는 다음 숫자는 각각 minvalue 또는 maxvalue가 됩니다.

NO CYCLE이 지정된 경우 시퀀스가 최댓값에 도달한 후 nextval을 직접적으로 호출하면 오류가 반환됩니다. CYCLENO CYCLE을 둘 다 지정하지 않으면 NO CYCLE이 기본값입니다.

시작

선택적 절 START WITH start를 사용하면 어디서나 시퀀스를 시작할 수 있습니다. 기본 시작 값은 오름차순 시퀀스의 경우 minvalue이고 내림차순 시퀀스의 경우 maxvalue입니다.

cache

CACHE cache는 더 빠른 액세스를 위해 사전 할당되고 메모리에 저장될 시퀀스 번호의 수를 지정합니다. Aurora DSQL에서 CACHE에 허용되는 값은 1 또는 65,536 이상의 모든 숫자입니다. 최솟값은 1입니다(한 번에 하나의 값만 생성할 수 있으므로 캐시가 없음).

OWNED BY table_name.column_name / OWNED BY NONE

OWNED BY 옵션을 사용하면 시퀀스가 특정 테이블 열과 연결되므로 해당 열(또는 전체 테이블)이 삭제되면 시퀀스도 자동으로 삭제됩니다. 지정된 테이블은 소유자가 동일해야 하며 시퀀스와 동일한 스키마에 있어야 합니다. 기본값인 OWNED BY NONE은 이러한 연결이 없음을 지정합니다.

참고

DROP SEQUENCE를 사용하여 시퀀스를 제거합니다.

시퀀스는 bigint 산술을 기반으로 하므로 범위는 8바이트 정수(-9,223,372,036,854,775,808~9,223,372,036,854,775,807)의 범위를 초과할 수 없습니다.

nextvalsetval 직접 호출은 롤백되지 않으므로 시퀀스 번호의 ‘간격 없는’ 할당이 필요한 경우 시퀀스 객체를 사용할 수 없습니다.

각 세션은 시퀀스 객체에 대한 한 번의 액세스 중에 연속 시퀀스 값을 할당 및 캐싱하고 그에 따라 시퀀스 객체의 last_value를 늘립니다. 그런 다음 해당 세션 내에서 다음번에 nextvalcache-1번 사용하면 시퀀스 객체를 터치하지 않고 미리 할당된 값을 반환하기만 합니다. 따라서 세션 내에서 할당되었지만 사용되지 않은 모든 숫자는 해당 세션이 종료될 때 손실되어 시퀀스에서 '구멍'이 됩니다.

또한 여러 세션이 고유한 시퀀스 값을 할당하도록 보장되지만 모든 세션이 고려되면 값이 시퀀스를 벗어나 생성될 수 있습니다. 예를 들어 cache 설정이 10인 경우 세션 A가 값 1..10을 예약하고 nextval=1을 반환한 다음, 세션 B는 세션 A가 nextval=2를 생성하기 전에 값 11..20을 예약하고 nextval=11을 반환할 수 있습니다. 따라서 cache 설정이 1이면 nextval 값이 순차적으로 생성된다고 가정하는 것이 안전합니다. cache 설정이 1보다 크면 nextval 값이 순차적으로만 생성되지 않고 모두 고유하다고 가정해야 합니다. 또한 last_valuenextval에서 아직 반환했는지 여부에 관계없이 모든 세션에서 예약한 최신 값을 반영합니다.

또 다른 고려 사항은 이러한 시퀀스에서 실행된 setval은 캐싱된 미리 할당된 값을 모두 사용할 때까지 다른 세션에서 인식되지 않는다는 것입니다.

예제

101부터 시작하여 serial이라는 오름차순 시퀀스를 생성합니다.

CREATE SEQUENCE serial CACHE 65536 START 101;

이 시퀀스에서 다음 번호를 선택합니다.

SELECT nextval('serial'); nextval --------- 101

이 시퀀스에서 다음 번호를 선택합니다.

SELECT nextval('serial'); nextval --------- 102

INSERT 명령에서 이 시퀀스를 사용합니다.

INSERT INTO distributors VALUES (nextval('serial'), 'nothing');

setval을 사용하여 시퀀스를 특정 값으로 재설정합니다.

SELECT setval('serial', 200); SELECT nextval('serial'); nextval --------- 201

호환성

CREATE SEQUENCE는 SQL 표준을 준수합니다. 단, 다음은 예외입니다.

  • 다음 값 가져오기는 표준 NEXT VALUE FOR 표현식 대신 nextval() 함수를 사용하여 수행됩니다.

  • OWNED BY 절은 PostgreSQL 확장입니다.