

# 시퀀스 및 자격 증명 열
<a name="sequences-identity-columns"></a>

시퀀스 및 자격 증명 열은 정수 값을 생성하며 간단하거나 사람이 읽을 수 있는 식별자가 필요할 때 유용합니다. 이러한 값에는 [`CREATE SEQUENCE`](create-sequence-syntax-support.md) 설명서에 설명된 할당 및 캐싱 동작이 포함됩니다.

**Topics**
+ [시퀀스 조작 함수](sequence-functions-syntax-support.md)
+ [ID 열](sequences-identity-columns-overview.md)
+ [시퀀스 및 자격 증명 열 작업](sequences-identity-columns-working-with.md)

# 시퀀스 조작 함수
<a name="sequence-functions-syntax-support"></a>

이 섹션에서는 시퀀스 객체(시퀀스 생성기 또는 단순히 시퀀스라고도 함)를 조작하기 위한 함수에 대해 설명합니다. 시퀀스 객체는 [`CREATE SEQUENCE`](create-sequence-syntax-support.md)로 만들어진 특수 단일 행 테이블입니다. 시퀀스 객체는 일반적으로 테이블 행의 고유 식별자를 생성하는 데 사용됩니다. 시퀀스 함수는 시퀀스 객체에서 연속 시퀀스 값을 얻기 위한 간단한 다중 사용자 환경에서 안전한 방법을 제공합니다.

**중요**  
시퀀스를 사용할 때는 캐시 값을 신중하게 고려해야 합니다. 자세한 내용은 [`CREATE SEQUENCE`](create-sequence-syntax-support.md) 페이지의 중요 안내를 참조하세요.  
워크로드 패턴을 기반으로 시퀀스를 가장 잘 사용하는 방법에 대한 지침은 [시퀀스 및 자격 증명 열 작업](sequences-identity-columns-working-with.md) 섹션을 참조하세요.


| 함수 | 설명 | 
| --- | --- | 
| nextval ( regclass ) → bigint | 시퀀스 객체를 다음 값으로 진행시키고 해당 값을 반환합니다. 이 작업은 원자적으로 수행됩니다. 여러 nextval 세션이 동시에 실행되더라도 각 세션은 안전하게 서로 다른 시퀀스 값을 수신합니다. 시퀀스 객체가 기본 파라미터로 만들어진 경우 연속 nextval 직접 호출은 1로 시작하는 증가하는 값을 반환합니다. [`CREATE SEQUENCE`](create-sequence-syntax-support.md) 명령에서 적절한 파라미터를 사용하여 다른 동작을 가져올 수 있습니다. 이 함수에는 시퀀스에 대한 USAGE 또는 UPDATE 권한이 필요합니다. | 
| setval ( regclass, bigint [, boolean ] ) → bigint | 시퀀스 객체의 현재 값과 선택적으로 is\$1called 플래그를 설정합니다. 2-파라미터 형식은 시퀀스의 last\$1value 필드를 지정된 값으로 설정하고 해당 is\$1called 필드를 true로 설정합니다. 즉, 다음 nextval은 값을 반환하기 전에 시퀀스를 진행합니다. currval에서 보고할 값도 지정된 값으로 설정됩니다. 3-파라미터 양식에서는 is\$1called를 true 또는 false로 설정할 수 있습니다. true는 2-파라미터 양식과 동일한 효과를 갖습니다. false로 설정하면 다음 nextval은 지정된 값을 정확히 반환하고 시퀀스 진행은 다음 nextval로 시작됩니다. 또한 currval에서 보고하는 값은 여기에서 변경되지 않습니다. 예제: <pre>SELECT setval('myseq', 42);           -- Next nextval will return 43<br />SELECT setval('myseq', 42, true);     -- Same as above<br />SELECT setval('myseq', 42, false);    -- Next nextval will return 42</pre> setval에서 반환되는 결과는 두 번째 인수의 값일 뿐입니다. 이 함수에는 시퀀스에 대한 UPDATE 권한이 필요합니다. | 
| currval ( regclass ) → bigint | 현재 세션에서 이 시퀀스에 대해 nextval에서 가장 최근에 얻은 값을 반환합니다. (이 세션에서 이 시퀀스에 대해 nextval이 직접적으로 호출된 적이 없는 경우 오류가 보고됩니다.) 세션-로컬 값을 반환하기 때문에 현재 세션으로 인해 다른 세션이 nextval을 실행했는지 여부에 대한 예측 가능한 답변을 제공합니다. 이 함수에는 시퀀스에 대한 USAGE 또는 SELECT 권한이 필요합니다. | 
| lastval () → bigint | 현재 트랜잭션에서 nextval이 가장 최근에 반환한 값을 반환합니다. 이 함수는 시퀀스 이름을 인수로 취하는 대신 현재 트랜잭션에서 nextval이 가장 최근에 적용된 시퀀스를 참조한다는 점을 제외하면 currval과 동일합니다. nextval이 현재 트랜잭션에서 아직 직접적으로 호출되지 않은 경우 lastval을 직접적으로 호출하는 것은 오류입니다. 이 함수에는 마지막으로 사용된 시퀀스에 대한 USAGE 또는 SELECT 권한이 필요합니다. | 

**주의**  
직접 호출 트랜잭션이 나중에 중단되는 경우 `nextval`에서 얻은 값은 재사용을 위해 회수되지 않습니다. 즉, 트랜잭션 중단 또는 데이터베이스 충돌로 인해 할당된 값 시퀀스에 공백이 발생할 수 있습니다. 이는 트랜잭션 중단 없이도 발생할 수 있습니다. 예를 들어 `ON CONFLICT` 절이 있는 `INSERT`는 `ON CONFLICT` 규칙을 대신 따르게 하는 충돌을 감지하기 전에 필요한 `nextval` 직접 호출 수행을 포함하여 삽입할 튜플을 계산합니다. 따라서 Aurora DSQL의 시퀀스 객체는 *‘간격 없는’ 시퀀스를 얻는 데 사용할 수 없습니다*.  
마찬가지로 `setval`에서 수행한 시퀀스 상태 변경은 다른 트랜잭션에 즉시 표시되며 호출 트랜잭션이 롤백되는 경우 실행 취소되지 않습니다.

시퀀스 함수에 의해 작동할 시퀀스는 `regclass` 인수에 의해 지정됩니다. 인수는 단순히 `pg_class` 시스템 카탈로그에 있는 시퀀스의 OID입니다. 그러나 `regclass` 데이터 형식의 입력 변환기가 작업을 대신 수행하므로 OID를 직접 조회할 필요는 없습니다. 자세한 내용은 [객체 식별자 유형](https://www.postgresql.org/docs/current/datatype-oid.html)에 대한 PostgreSQL 설명서를 참조하세요.

# ID 열
<a name="sequences-identity-columns-overview"></a>

**중요**  
자격 증명 열을 사용할 때는 캐시 값을 신중하게 고려해야 합니다. 자세한 내용은 [`CREATE SEQUENCE`](create-sequence-syntax-support.md) 페이지의 중요 안내를 참조하세요.  
워크로드 패턴을 기반으로 자격 증명 열을 가장 잘 사용하는 방법에 대한 지침은 [시퀀스 및 자격 증명 열 작업](sequences-identity-columns-working-with.md) 섹션을 참조하세요.

자격 증명 열은 암시적 시퀀스에서 자동으로 생성되는 특수 열입니다. 키 값을 생성하는 데 사용할 수 있습니다. 자격 증명 열을 만들려면 [`CREATE TABLE`](create-table-syntax-support.md)의 `GENERATED ... AS IDENTITY` 절을 사용합니다. 예를 들면 다음과 같습니다.

```
CREATE TABLE people (
    id bigint GENERATED ALWAYS AS IDENTITY (CACHE 70000),
    ...
);
```

또는 다음을 사용합니다.

```
CREATE TABLE people (
    id bigint GENERATED BY DEFAULT AS IDENTITY (CACHE 70000),
    ...
);
```

자세한 내용은 [`CREATE TABLE`](create-table-syntax-support.md) 섹션을 참조하세요.

자격 증명 열이 있는 테이블에서 `INSERT` 명령이 실행되고 자격 증명 열에 명시적으로 지정된 값이 없는 경우 암시적 시퀀스에서 생성된 값이 삽입됩니다. 예를 들어 앞의 정의를 사용하고 적절한 열을 추가로 가정하여 다음을 작성합니다.

```
INSERT INTO people (name, address) VALUES ('A', 'foo');
INSERT INTO people (name, address) VALUES ('B', 'bar');
```

1부터 `id` 열 값을 생성하여 다음 테이블 데이터를 생성합니다.

```
 id | name | address
----+------+---------
  1 | A    | foo
  2 | B    | bar
```

또는 값 대신 `DEFAULT` 키워드를 지정하여 시퀀스 생성 값을 명시적으로 요청할 수 있습니다.

```
INSERT INTO people (id, name, address) VALUES (DEFAULT, 'C', 'baz');
```

마찬가지로 `DEFAULT` 키워드는 `UPDATE` 명령에 사용할 수 있습니다.

따라서 여러 가지 면에서 자격 증명 열은 기본값이 있는 열처럼 동작합니다.

열 정의의 `ALWAYS` 및 `BY DEFAULT` 절은 `INSERT` 및 `UPDATE` 명령에서 사용자 지정 값을 명시적으로 처리하는 방법을 결정합니다. `INSERT` 명령에서 `ALWAYS`가 선택된 경우 `INSERT` 문이 `OVERRIDING SYSTEM VALUE`를 지정하는 경우에만 사용자 지정 값이 허용됩니다. `BY DEFAULT`를 선택하면 사용자 지정 값이 우선합니다. 따라서 `BY DEFAULT`를 사용하면 기본값과 더 유사한 동작이 발생하며, 기본값은 명시적 값으로 재정의될 수 있는 반면 `ALWAYS`는 실수로 명시적 값을 삽입하는 것에 대해 더 많은 보호를 제공합니다.

자격 증명 열의 데이터 형식은 시퀀스에서 지원하는 데이터 형식 중 하나여야 합니다. ([`CREATE SEQUENCE`](create-sequence-syntax-support.md)를 참조하세요.) 자격 증명 열을 만들 때 연결된 시퀀스의 속성을 지정하거나([`CREATE TABLE`](create-table-syntax-support.md) 참조) 나중에 변경할 수 있습니다([`ALTER TABLE`](alter-table-syntax-support.md) 참조).

자격 증명 열은 자동으로 `NOT NULL`로 표시됩니다. 그러나 자격 증명 열은 고유성을 보장하지 않습니다. (시퀀스는 일반적으로 고유한 값을 반환하지만 앞서 설명한 대로 시퀀스를 재설정하거나 값을 자격 증명 열에 수동으로 삽입할 수 있습니다.) `PRIMARY KEY` 또는 `UNIQUE` 제약 조건을 사용하여 고유성을 적용해야 합니다.

# 시퀀스 및 자격 증명 열 작업
<a name="sequences-identity-columns-working-with"></a>

이 섹션에서는 워크로드 패턴을 기반으로 시퀀스 및 자격 증명 열을 가장 잘 사용하는 방법을 이해하는 데 도움이 됩니다.

**중요**  
할당 및 캐싱 동작에 대한 자세한 내용은 [`CREATE SEQUENCE`](create-sequence-syntax-support.md) 페이지의 중요 안내를 참조하세요.

## 식별자 유형 선택
<a name="sequences-identity-columns-choosing-identifier-types"></a>

Amazon Aurora DSQL은 시퀀스 또는 자격 증명 열을 사용하여 생성된 UUID 기반 식별자와 정수 값을 모두 지원합니다. 이러한 옵션은 값이 할당되는 방식과 로드 시 조정되는 방식에 따라 다릅니다.

UUID 값은 조정 없이 만들 수 있으며 식별자가 자주 또는 여러 세션에서 만들어지는 워크로드에 적합합니다. Amazon Aurora DSQL은 분산 작업을 위해 설계되었으므로 조정을 피하는 것이 유용한 경우가 많습니다. 따라서 UUID 기본 식별자 유형으로 권장되며, 특히 확장성이 중요하고 식별자의 엄격한 순서 지정이 필요하지 않은 워크로드의 프라이머리 키에 권장됩니다.

시퀀스 및 자격 증명 열은 사람이 읽을 수 있는 식별자, 보고 및 외부 인터페이스에 편리한 작은 정수 값을 생성합니다. 사용성 또는 통합 이유로 숫자 식별자를 선호하는 경우, UUID 기반 식별자와 함께 시퀀스 또는 자격 증명 열을 사용하는 것이 좋습니다. 정수 시퀀스 또는 자격 증명 값이 필요한 경우, 적절한 캐시 크기를 선택하는 것이 워크로드 설계의 중요한 부분이 됩니다. 캐시 크기 선택에 대한 지침은 다음 섹션을 참조하세요.

## 캐시 크기 선택
<a name="sequences-identity-columns-choosing-cache-size"></a>

적절한 캐시 값을 선택하는 것은 시퀀스 및 자격 증명 열을 효과적으로 사용하는 데 중요한 부분입니다. 캐시 설정은 로드 시 식별자 할당이 작동하는 방식을 결정하여 시스템 처리량과 값이 할당 순서를 반영하는 정도에 영향을 미칩니다.

**`CACHE >= 65536`의 캐시 크기가 클수록 다음과 같은 경우에 적합합니다.**
+ 식별자가 높은 빈도로 생성됨
+ 여러 세션이 동시에 삽입됨
+ 워크로드가 간격과 눈에 보이는 순서 지정 효과를 허용할 수 있음

예를 들어 대용량 이벤트 수집 워크로드(예: IoT 또는 원격 측정)와 작업 실행 ID, 지원 사례 참조 또는 내부 주문 번호와 같은 운영 식별자는 일반적으로 식별자가 자주 생성되고 엄격한 순서 지정이 필요하지 않은 더 큰 캐시 크기의 이점을 누릴 수 있습니다.

**다음과 같은 경우에는 캐시 크기 1이 더 적합합니다.**
+ 할당률이 비교적 낮음
+ 식별자가 시간이 지남에 따라 할당 순서를 더 가깝게 따를 것으로 예상됨
+ 간격을 최소화하는 것이 최대 처리량보다 더 중요함

식별자가 덜 자주 생성되고 순서 지정이 더 가까운 계정 또는 참조 번호 할당과 같은 워크로드에는 캐시 크기 1이 더 적합합니다.