시퀀스 대 정체성


87

SQL Server 2012 Sequence는 Oracle 및 Postgres와 동일한 새로운 기능으로 도입 되었습니다. 서열이 정체성보다 선호되는 곳은 어디입니까? 그리고 왜 시퀀스가 ​​필요한가요?


둘 다 사용한 후에는 데이터베이스에서 전역 사용을 위해 Identity를 선호합니다. 즉, ObjectID와 같은 자동 증가 번호가 필요하고 여러 테이블에서 사용하려는 경우입니다. 시퀀스를 만든 다음 응용 프로그램 (웹 사이트 또는 앱 등)을 사용하여 시퀀스 번호를 기반으로 테이블 삽입 및 업데이트를 관리하는 것은 복잡해집니다.
볼륨 1

답변:


81

여기에서 답을 찾을 수있을 것 같아요

열의 ID 속성을 사용하면 자동 증가 번호 (기본 키로 자주 사용됨)를 쉽게 생성 할 수 있습니다. Sequence를 사용하면 삽입하는 동안 테이블 열에 연결할 수있는 다른 개체가됩니다. ID와 달리 열 값의 다음 번호는 디스크가 아닌 메모리에서 검색됩니다. 따라서 시퀀스가 ​​ID보다 훨씬 빠릅니다. 우리는 다음 예제에서 이것을 볼 것입니다.

그리고 여기 :

시퀀스 : 시퀀스는 SQL Server 커뮤니티에서 수년 동안 요청되었으며이 릴리스에 포함되었습니다. 시퀀스는 일련의 숫자를 생성하는 사용자 정의 개체입니다. 다음은 Sequence를 사용한 예입니다.

그리고 여기에도 :

SQL Server 시퀀스 개체는 SQL 테이블의 ID 열처럼 일련의 숫자를 생성합니다. 그러나 시퀀스 번호의 장점은 시퀀스 번호 개체가 단일 SQL 테이블로 제한되지 않는다는 것입니다.

그리고 msdn에서 사용법과 이것이 필요한 이유에 대해 더 자세히 읽을 수 있습니다 ( 여기 ).

시퀀스는 시퀀스가 ​​생성 된 사양에 따라 숫자 값 시퀀스를 생성하는 사용자 정의 스키마 바인딩 개체입니다. 숫자 값의 시퀀스는 정의 된 간격으로 오름차순 또는 내림차순으로 생성되며 요청에 따라 순환 (반복) 할 수 있습니다. ID 열과 달리 시퀀스는 테이블과 연결되지 않습니다. 응용 프로그램은 다음 값을 받기 위해 시퀀스 개체를 참조합니다. 시퀀스와 테이블 간의 관계는 애플리케이션에 의해 제어됩니다. 사용자 애플리케이션은 시퀀스 객체를 참조하고 여러 행과 테이블에서 값 키를 조정할 수 있습니다.

시퀀스는 CREATE SEQUENCE 문을 사용하여 테이블과 독립적으로 생성됩니다. 옵션을 사용하면 증분, 최대 및 최소 값, 시작 지점, 자동 다시 시작 기능 및 캐싱을 제어하여 성능을 향상시킬 수 있습니다. 옵션에 대한 정보는 CREATE SEQUENCE를 참조하십시오.

행이 삽입 될 때 생성되는 식별 컬럼 값과 달리 애플리케이션은 NEXT VALUE FOR 함수를 호출하여 행을 삽입하기 전에 다음 시퀀스 번호를 얻을 수 있습니다. 번호가 테이블에 삽입되지 않더라도 NEXT VALUE FOR가 호출되면 시퀀스 번호가 할당됩니다. NEXT VALUE FOR 함수는 테이블 정의에서 열의 기본값으로 사용할 수 있습니다. 한 번에 여러 시퀀스 번호 범위를 가져 오려면 sp_sequence_get_range를 사용하십시오.

시퀀스는 정수 데이터 유형으로 정의 할 수 있습니다. 데이터 유형이 지정되지 않은 경우 시퀀스의 기본값은 bigint입니다.


21

시퀀스와 ID는 모두 자동 번호를 생성하는 데 사용되지만 주요 차이점은 ID는 테이블에 따라 다르며 시퀀스는 테이블과 독립적이라는 것입니다.

자동 번호를 전역 적으로 (여러 테이블에서) 유지해야하는 시나리오가있는 경우 특정 번호 이후 간격을 다시 시작해야하고 성능을 위해 캐시해야하는 경우 여기에 시퀀스가 ​​필요하지 않습니다. 정체.


14

시퀀스는 ID 열보다 더 많은 유연성을 제공하지만 성능상의 이점이 없다는 것을 알았습니다.

ID를 사용한 성능이 배치 삽입에 시퀀스를 사용하는 것보다 일관되게 3 배 빠르다는 것을 발견했습니다.

약 150 만 행을 삽입했고 성능은 다음과 같습니다.

  • 신원 확인을 위해 14 초
  • 시퀀스 45 초

테이블 기본값을 통해 시퀀스 개체를 사용하는 테이블에 행을 삽입했습니다.

NEXT VALUE for <seq> for <col_name>

또한 select 문에서 시퀀스 값을 지정하려고 시도했습니다.

SELECT NEXT VALUE for <seq>, <other columns> from <table>

둘 다 식별 방법보다 느린 동일한 요인이었습니다. 시퀀스에 기본 캐시 옵션을 사용했습니다.

Arion의 첫 번째 링크에서 참조 된 기사는 행 단위 삽입의 성능을 보여 주며 ID와 시퀀스의 차이는 10,000 개의 삽입에 대해 16.6 초에서 14.3 초였습니다.

캐싱 옵션은 성능에 큰 영향을 주지만 더 많은 볼륨 (+ 1M 행)의 경우 ID가 더 빠릅니다.

utly4life의 의견에 따른 심층 분석 은이 링크 를 참조하십시오 .


시퀀스의 캐시 크기는 얼마입니까?
Shannon Severance

50을 늘리면 차이가 있지만 정체성은 여전히 ​​더 빨랐습니다.
Stagg

2
byobi.com/blog/2012/09/… 다양한 구성에 대한 자세한 비교를 제공합니다. 캐시 크기가 50에서 500으로 증가하면 약 2 배의 속도 차이가 발생합니다.
ulty4life

1
시퀀스가 식별 열보다 느리다고 제안합니까? 디스크에서 가져온 신원과는 달리 시퀀스가 ​​메모리에 있으므로 반대의 인상을 받았습니다. 당신의 발견은 매우 놀랍습니다. 공유해 주셔서 감사합니다.
RBT

1
시퀀스를 사용 alter sequence increment by ...하면 단순히 새 행을위한 공간을 만들고 base + row_number () 또는 실제 값에 대해 무엇이든 사용하여 일괄 삽입 성능을 최적화 할 수 있습니다 .
고든

6

나는 이것이 조금 오래되었다는 것을 알고 있지만 나를 물어 뜯는 관찰을 추가하고 싶었습니다.

인덱스를 순서대로 갖기 위해 ID에서 시퀀스로 전환했습니다. 나중에 시퀀스가 ​​복제로 전송되지 않는다는 것을 알게되었습니다. 시퀀스가 동기화되지 않았기 때문에 두 데이터베이스간에 복제를 설정 한 후 키 위반이 발생하기 시작했습니다. 결정을 내리기 전에주의해야 할 사항입니다.


3

시퀀스를 가장 잘 사용하는 방법은 ID 열을 바꾸는 것이 아니라 "주문 번호"유형의 필드를 만드는 것입니다.

즉, 주문 번호는 최종 사용자에게 노출되며 이와 함께 비즈니스 규칙이있을 수 있습니다. 고유하게 만들고 싶지만 ID 열을 사용하는 것도 실제로 올바르지 않습니다.

예를 들어, 다른 주문 유형에는 다른 순서가 필요할 수 있으므로 사내 주문과 반대로 인터넷 주문에 대한 순서가있을 수 있습니다.

즉, 시퀀스를 신원의 단순한 대체물로 생각하지 말고 신원이 비즈니스 요구 사항에 맞지 않는 경우 유용하다고 생각하십시오.


1

최근에는 동일성 대 서열에 대해 고려해야 할 사항이 조금씩있었습니다. 공백없이 정체성을 유지하려는 경우 MSFT가 이제 시퀀스를 제안하는 것 같습니다. ID에 큰 차이가있는 문제가 있었지만 강조 표시된이 문을 기반으로 SQL이 ID를 캐시하고 재부팅 후 해당 번호를 잃었다는 문제를 설명 할 수 있습니다.

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql-identity-property?view=sql-server-2017

서버 재시작 또는 기타 실패 후 연속 값-SQL Server는 성능상의 이유로 ID 값을 캐시 할 수 있으며 데이터베이스 실패 또는 서버 재시작 중에 할당 된 값 중 일부가 손실 될 수 있습니다. 이로 인해 삽입시 ID 값에 간격이 생길 수 있습니다. 간격이 허용되지 않는 경우 애플리케이션은 자체 메커니즘을 사용하여 키 값을 생성해야합니다. NOCACHE 옵션과 함께 시퀀스 생성기를 사용하면 커밋되지 않은 트랜잭션에 대한 간격을 제한 할 수 있습니다.


1
거기 당신은 건너 뛰는 이유에 꽤 좋은 답변입니다 IDENTITY번호는 링크SEQUENCE여기에 설명 된 것과 같은 문제가 링크를 하지만 작은 캐시 크기를 설정하여 제한 할 수 있습니다하지만 속도 트레이드 오프 (trade off)가있다.
Mrphin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.