적용 대상:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric의 SQL 데이터베이스
시퀀스 개체를 만들고 해당 속성을 지정합니다. 시퀀스는 시퀀스를 만들 때 사용된 사양에 따라 숫자 값의 시퀀스를 생성하는 사용자 정의 스키마 바운드 개체입니다. 숫자 값의 시퀀스는 정의된 간격에 따라 오름차순이나 내림차순으로 생성되며, 시퀀스가 모두 사용되면 다시 시작(순환)되도록 구성할 수 있습니다.
ID 열과 달리 시퀀스는 특정 테이블과 연결되지 않습니다. 애플리케이션에서는 시퀀스 개체를 참조하여 다음 값을 검색합니다. 시퀀스와 테이블 간의 관계는 애플리케이션에서 제어합니다. 사용자 애플리케이션에서는 시퀀스 개체를 참조하고 여러 행 및 테이블에서 값을 조정합니다.
행을 삽입할 때 생성되는 ID 열 값과 달리 애플리케이션은 NEXT VALUE FOR를 호출하여 행을 삽입하지 않고도 다음 시퀀스 번호를 가져올 수 있습니다. 여러 시퀀스 번호를 한 번에 가져오려면 sp_sequence_get_range 를 사용합니다.
함수와 함수를 모두 CREATE SEQUENCE 사용하는 정보 및 시나리오는 NEXT VALUE FOR시퀀스 번호를 참조하세요.
구문
CREATE SEQUENCE [ schema_name . ] sequence_name
[ AS [ built_in_integer_type | user-defined_integer_type ] ]
[ START WITH <constant> ]
[ INCREMENT BY <constant> ]
[ { MINVALUE [ <constant> ] } | { NO MINVALUE } ]
[ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ]
[ CYCLE | { NO CYCLE } ]
[ { CACHE [ <constant> ] } | { NO CACHE } ]
[ ; ]
인수
sequence_name
데이터베이스에서 시퀀스를 식별하는 고유 이름을 지정합니다. 형식은 sysname입니다.
[ built_in_integer_type | 사용자 defined_integer_type ]
시퀀스는 모든 정수 유형으로 정의할 수 있습니다. 다음 형식이 허용됩니다.
- tinyint - 0에서 255 사이의 범위
- smallint - -32,767에서 32,768 사이의 범위
- int - -2,147,483,648에서 2,147,483,647 사이의 범위
- bigint - -9,223,372,036,854,775,808에서 9,223,372,036,854,775,807 사이의 범위
- 소수 자릿수가 0인 decimal 또는 numeric.
- 허용되는 형식 중 하나에 기반을 둔 사용자 정의 데이터 형식(별칭 유형)
데이터 형식을 제공하지 않은 경우 bigint 데이터 형식이 기본값으로 사용됩니다.
START WITH <상수>
시퀀스 개체가 반환하는 첫 번째 값입니다. 값은 START 최대값보다 작거나 같아야 하며 시퀀스 개체의 최소값보다 크거나 같아야 합니다. 새 시퀀스 개체의 기본 시작 값은 오름차순 시퀀스 개체에 대해서는 최소값이고, 내림차순 시퀀스 개체에 대해서는 최대값입니다.
INCREMENT BY <상수>
함수에 대한 각 호출에 대한 시퀀스 개체의 값을 증가(또는 음수인 경우 감소)하는 NEXT VALUE FOR 데 사용되는 값입니다. 증분이 음수 값이면 시퀀스 개체가 내림차순입니다. 그렇지 않으면 오름차순입니다. 증분은 0일 수 없습니다. 새 시퀀스 개체의 기본 증가분은 1입니다.
[ MINVALUE <상수> | NO MINVALUE ]
시퀀스 개체의 경계를 지정합니다. 새 시퀀스 개체의 기본 최소값은 해당 시퀀스 개체의 데이터 형식에 대한 최소값입니다. tinyint 형식에 대해서는 0이고 다른 모든 데이터 형식에 대해서는 음수입니다.
[ MAXVALUE <상수> | MAXVALUE 없음
시퀀스 개체의 경계를 지정합니다. 새 시퀀스 개체의 기본 최대값은 해당 시퀀스 개체의 데이터 형식에 대한 최대값입니다.
[ 사이클 | 사이클 없음 ]
시퀀스 개체를 최소값 또는 최대값(내림차순 시퀀스 개체의 경우)에서 다시 시작해야 하는지, 아니면 최소값 또는 최대값을 초과하는 경우 예외를 발생시켜야 하는지를 지정하는 속성입니다. 새 시퀀스 개체의 기본 주기 옵션은 .입니다 NO CYCLE.
참고
순환은 SEQUENCE 시작 값이 아닌 최소 또는 최대값에서 다시 시작됩니다.
[ CACHE [ <상수> ] | NO CACHE ]
시스템 번호를 생성하는 데 필요한 디스크 IO 수를 최소화하여 시퀀스 개체를 사용하는 애플리케이션의 성능을 향상시킵니다. 기본값은 CACHE입니다.
예를 들어 캐시 크기가 50인 경우 SQL Server는 50개의 개별 값을 캐시된 상태로 유지하지 않습니다. 현재 값과 캐시에 남아 있는 값의 양만 캐시합니다. 따라서 캐시 저장에 필요한 메모리 양은 항상 시퀀스 개체 데이터 형식의 인스턴스 두 개입니다.
참고
캐시 크기를 지정하지 않고 캐시 옵션을 사용하도록 설정하면 데이터베이스 엔진이 크기를 선택합니다. 그러나 사용자는 선택 항목이 일관되지 않도록 해서는 안 됩니다. Microsoft는 캐시 크기 계산 방법을 예고 없이 변경할 수 있습니다.
옵션을 사용하여 CACHE 만든 경우 예기치 않은 종료(예: 전원 오류)로 인해 캐시에 남아 있는 시퀀스 번호가 손실될 수 있습니다.
비고
시퀀스 번호는 현재 트랜잭션 범위 외부에서 생성되며, 시퀀스 번호를 사용하는 트랜잭션이 커밋되거나 롤백되는지 여부에 관계없이 소비됩니다. 중복 유효성 검사는 레코드가 완전히 채워진 후에만 수행됩니다. 이 문제는 생성 중에 동일한 번호가 둘 이상의 레코드에 사용되지만 중복으로 식별되는 경우가 발생할 수 있습니다. 이 상황이 발생하고 다른 자동 번호 값이 후속 레코드에 적용되면 자동 번호 값 사이의 간격이 발생하여 예상되는 동작이 될 수 있습니다.
캐시 관리
성능을 향상시키기 위해 SQL Server는 인수에 지정된 CACHE 시퀀스 번호 수를 미리 할당합니다.
예를 들어 시작 값이 1이고 캐시 크기가 15인 새 시퀀스가 만들어집니다. 첫 번째 값이 필요한 경우 1에서 15 사이의 값을 메모리에서 사용할 수 있습니다. 마지막으로 캐시된 값(15)은 디스크의 시스템 테이블에 기록됩니다. 15개 번호를 모두 사용한 경우 다음 요청(16번) 시 캐시가 다시 할당됩니다. 마지막으로 캐시된 새 값(30)이 시스템 테이블에 기록됩니다.
22개 번호를 사용한 후에 데이터베이스 엔진이 중지된 경우 이전에 저장된 번호 대신 메모리에서 다음에 예정된 시퀀스 번호(23)가 시스템 테이블에 기록됩니다.
SQL Server를 다시 시작한 후 시퀀스 번호가 필요하면 시스템 테이블에서 시작 번호(23)를 읽습니다. 15개 번호(23-38)의 캐시 양이 메모리에 할당되고 캐시되지 않은 다음 번호(39)가 시스템 테이블에 기록됩니다.
전원 오류와 같은 상황에서 데이터베이스 엔진이 비정상적으로 중지된 경우에는 시스템 테이블에서 읽은 번호(39)로 시퀀스가 다시 시작됩니다. 메모리에 할당되었지만 사용자 또는 애플리케이션에서 요청한 적이 없는 시퀀스 번호는 모두 손실됩니다. 이 기능은 간격을 둘 수 있지만, 단일 시퀀스 개체가 정의 CYCLE 되었거나 수동으로 다시 시작되지 않는 한 동일한 값이 두 번 실행되지 않도록 보장합니다.
캐시는 현재 값(마지막으로 발급된 값) 및 캐시에 남아 있는 값의 양을 추적하여 메모리에 유지됩니다. 따라서 캐시에서 사용하는 메모리 양은 항상 시퀀스 개체 데이터 형식의 인스턴스 두 개입니다.
시퀀스를 사용할 때마다 시스템 테이블에 현재 시퀀스 값을 쓰도록 NO CACHE 캐시 인수를 설정합니다. 이로 인해 디스크 액세스가 증가하여 성능이 저하될 수는 있지만 의도하지 않은 간격이 발생할 수 있는 가능성은 줄어듭니다. 숫자 또는 NEXT VALUE FOR 함수를 사용하여 sp_sequence_get_range 숫자를 요청했지만 숫자가 사용되지 않거나 커밋되지 않은 트랜잭션에 사용되는 경우에도 간격이 발생할 수 있습니다.
시퀀스 개체가 이 CACHE 옵션을 사용하는 경우 시퀀스 개체를 다시 시작하거나 , INCREMENT, CYCLE또는 MINVALUE캐시 크기 속성을 변경MAXVALUE하면 변경이 발생하기 전에 캐시가 시스템 테이블에 기록됩니다. 그런 다음 캐시가 현재 값(즉, 숫자를 건너뛰지 않음)으로 시작하여 다시 로드됩니다. 캐시 크기 변경은 즉시 적용됩니다.
캐시된 값을 사용할 수 있는 경우 CACHE 옵션
다음 프로세스는 시퀀스 개체의 메모리 내 캐시에서 사용할 수 있는 사용되지 않는 값이 있는 경우 옵션에 대한 CACHE 다음 값을 생성하도록 시퀀스 개체가 요청될 때마다 발생합니다.
- 시퀀스 개체의 다음 값이 계산됩니다.
- 시퀀스 개체의 새로운 현재 값이 메모리 내에서 업데이트됩니다.
- 문 호출 시 계산된 값이 반환됩니다.
캐시가 소진된 경우의 CACHE 옵션
다음 프로세스는 캐시가 소진된 경우 옵션에 대한 CACHE 다음 값을 생성하도록 시퀀스 개체를 요청할 때마다 발생합니다.
시퀀스 개체의 다음 값이 계산됩니다.
새 캐시의 마지막 값이 계산됩니다.
시퀀스 개체에 대한 시스템 테이블 행이 잠기고, 2단계에서 계산된 값(마지막 값)이 시스템 테이블에 기록됩니다. 캐시가 소진된 확장 이벤트는 사용자에게 새로운 지속형 값을 알리기 위해 발생합니다.
NO CACHE 옵션
다음 프로세스는 시퀀스 개체가 옵션에 대한 NO CACHE 다음 값을 생성하도록 요청할 때마다 발생합니다.
- 시퀀스 개체의 다음 값이 계산됩니다.
- 시퀀스 개체의 새로운 현재 값이 시스템 테이블에 기록됩니다.
- 문 호출 시 계산된 값이 반환됩니다.
메타데이터
시퀀스에 대한 자세한 내용을 보려면 sys.sequences를 쿼리하십시오.
보안
사용 권한
에 대한 CREATE SEQUENCEALTERCONTROLSCHEMA사용 권한이 필요합니다.
- db_owner 및 db_ddladmin 고정 데이터베이스 역할의 멤버는 시퀀스 개체를 만들고, 변경하고, 삭제할 수 있습니다.
- db_owner 및 db_datawriter 고정 데이터베이스 역할의 멤버는 시퀀스 개체를 업데이트하여 숫자를 생성할 수 있습니다.
다음 예제에서는 스키마에서 시퀀스를 만들 수 있는 AdventureWorks\Larry 권한을 사용자에게 Test 부여합니다.
GRANT CREATE SEQUENCE
ON SCHEMA::Test TO [AdventureWorks\Larry];
시퀀스 개체의 소유권은 문을 사용하여 ALTER AUTHORIZATION 전송할 수 있습니다.
시퀀스에서 사용자 정의 데이터 형식을 사용하는 경우 시퀀스의 작성자는 해당 형식에 대한 권한이 있어야 합니다 REFERENCES .
감사
감사CREATE SEQUENCE하려면 .SCHEMA_OBJECT_CHANGE_GROUP
예제
시퀀스를 만들고 함수를 사용하여 NEXT VALUE FOR 시퀀스 번호를 생성하는 예제는 시퀀스 번호를 참조하세요.
다음 예에서는 대부분 테스트라는 스키마의 시퀀스 개체를 만듭니다.
테스트 스키마를 만들려면 다음 명령문을 실행합니다.
CREATE SCHEMA Test;
GO
A. 1씩 증가하는 시퀀스 만들기
다음 예제에서 Thierry는 CountBy1이라는 시퀀스를 만들어 사용할 때마다 하나씩 증가합니다.
CREATE SEQUENCE Test.CountBy1
START WITH 1
INCREMENT BY 1;
GO
B. 1씩 감소하는 시퀀스 만들기
다음 예제는 0에서 시작하여 사용될 때마다 1씩 음수로 계산됩니다.
CREATE SEQUENCE Test.CountByNeg1
START WITH 0
INCREMENT BY -1;
GO
C. 5씩 증가하는 시퀀스 만들기
다음 예제에서는 시퀀스를 사용할 때마다 5씩 증가하는 시퀀스를 만듭니다.
CREATE SEQUENCE Test.CountBy1
START WITH 5
INCREMENT BY 5;
GO
D. 지정된 숫자로 시작하는 시퀀스 만들기
Thierry는 테이블을 가져온 후 지금까지 사용된 가장 높은 ID 번호가 24,328임을 알게 됩니다. Thierry에는 24,329부터 숫자를 생성하는 시퀀스가 필요합니다. 다음 코드에서는 24,329부터 시작하여 1씩 증가하는 시퀀스를 만듭니다.
CREATE SEQUENCE Test.ID_Seq
START WITH 24329
INCREMENT BY 1;
GO
E. 기본값을 사용하여 시퀀스 만들기
다음 예에서는 기본값을 사용하여 시퀀스를 만듭니다.
CREATE SEQUENCE Test.TestSequence;
시퀀스 속성을 보려면 다음 문을 실행합니다.
SELECT *
FROM sys.sequences
WHERE name = 'TestSequence';
출력의 목록 일부는 기본값을 나타냅니다.
| 출력 | 기본값 |
|---|---|
start_value |
-9223372036854775808 |
increment |
1 |
minimum_value |
-9223372036854775808 |
maximum_value |
9223372036854775807 |
is_cycling |
0 |
is_cached |
1 |
current_value |
-9223372036854775808 |
F. 특정 데이터 형식을 사용하여 시퀀스 만들기
다음 예에서는 smallint 데이터 형식을 사용하여 -32,768부터 32,767까지의 시퀀스를 만듭니다.
CREATE SEQUENCE SmallSeq
AS SMALLINT;
G. 모든 인수를 사용하여 시퀀스 만들기
다음 예에서는 decimal 데이터 형식을 사용하여 0부터 255 사이 범위의 DecSeq라는 시퀀스를 만듭니다. 시퀀스는 125부터 시작하여 번호가 생성될 때마다 25씩 증가합니다. 시퀀스가 순환하도록 구성되었기 때문에 값이 최대값 200을 초과하는 경우 최소값 100에서 시퀀스가 다시 시작됩니다.
CREATE SEQUENCE Test.DecSeq
AS DECIMAL (3, 0)
START WITH 125
INCREMENT BY 25
MINVALUE 100
MAXVALUE 200
CYCLE
CACHE 3;
첫 번째 값(START WITH 옵션 125)을 보려면 다음 문을 실행합니다.
SELECT NEXT VALUE FOR Test.DecSeq;
150, 175 및 200을 반환하려면 문을 세 번 더 실행합니다.
시작 값이 MINVALUE 옵션 100으로 다시 순환되는 방식을 보려면 문을 다시 실행합니다.
캐시 크기를 확인하고 현재 값을 보려면 다음 코드를 실행합니다.
SELECT cache_size, current_value
FROM sys.sequences
WHERE name = 'DecSeq';