이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 12359|회답: 1

[출처] SQL Server 2012 자동 성장 컬럼 및 값 점프 문제

[링크 복사]
게시됨 2018. 8. 23. 오후 12:03:06 | | | |
소개

SQL Server 2012 릴리스부터는 SQL Server 인스턴스를 재시작하면 테이블의 자동 성장 열의 값이 결정되고, 특정 점프 값은 성장 열의 데이터 타입에 의해 결정됩니다. 데이터 타입이 정수형이면 점프 값은 1000이고, 데이터 타입이 바이틴트라면 점프 값은 10000입니다. 우리 프로젝트에서 이런 점프 문제는 특히 클라이언트 측에서 보일 때 용납될 수 없습니다. 이 이상한 문제는 SQL Server 2012 이후 버전에서만 발생하며, SQL Server 2012 이전 버전에서는 존재하지 않습니다.


배경

며칠 전, 우리 QA 팀의 한 동료가 제안했습니다: 우리 테이블의 자기 증가 열의 값이 설명할 수 없이 10,000 증가했습니다. 즉, 표에서 자기 증가 열의 마지막 값은 2200이었으나, 새 기록을 추가하면서 자기 증가 열의 숫자가 12200이 되었습니다. 비즈니스 논리상 이런 상황은 클라이언트에게 허용되지 않으므로 이 문제를 해결해야 합니다.


코드 사용

처음에는 우리 모두가 매우 이상했어요, 어떻게 이런 일이 일어난 걸까요? 우리는 보통 자기 증가 열에 수동으로 값을 삽입하지 않으며(자기 인플러팅 열에 수동으로 값을 삽입하는 것은 괜찮습니다), 자기 인플러팅 열의 값은 데이터베이스 자체에서 관리합니다. 우리 핵심 팀의 한 멤버가 이 질문을 조사하기 시작했고 답을 찾았습니다. 이제 이 문제와 제 동료가 찾은 해결책을 자세히 설명하고자 합니다.


이 버그를 재현하는 방법


SQL Server 2012를 설치한 후 테스트 데이터베이스를 만들어야 합니다. 그 다음 자가 성장하는 열로 테이블을 만듭니다:
이제 두 개의 데이터를 삽입합니다:

결과를 검토하세요:






이 시점에서 결과는 우리가 예상한 것과 같았습니다. 이제 SQL Server 서비스를 재시작하세요. SQL 서비스를 재시작하는 방법은 여러 가지가 있으며, 여기서는 SQL Server Manager를 사용하여 재시작합니다:



재시작 후 방금 테이블에 2개의 데이터를 추가로 삽입했습니다:



결과를 검토하세요:




이제 SQL Server 2012를 재시작한 결과가 보이며, 자기 증가 열값이 1002부터 시작합니다. 즉, 1000번 뛰었어요. 앞서 언급했듯이, 추가하는 데이터 타입이 bigint라면 점프 값은 10,000이 됩니다.


정말 버그인가요?

마이크로소프트는 이것이 버그가 아니라 기능이며, 여러 상황에서 유용하다고 밝혔습니다. 하지만 우리 경우에는 이런 기능이 필요하지 않습니다. 왜냐하면 이 자기 증가 데이터는 고객에게 보여지기 위한 것이고, 고객이 이런 점프 데이터를 보면 이상하게 느낄 수 있기 때문입니다. 점프 값은 SQL Server를 재시작한 횟수에 따라 결정됩니다. 이 데이터가 고객에게 표시되지 않는다면 허용될 수 있습니다. 따라서 이 기능은 보통 내부 사용에만 적합합니다.



용액

만약 마이크로소프트가 제공하는 이 "기능"에 관심이 없다면, 끄는 두 가지 방법이 있습니다.

1. 수열 사용

2. SQL Server용 시작 매개변수 -t272를 등록합니다



시퀀스 사용

먼저, 표의 자기 증가 열을 제거해야 합니다. 그 다음 캐싱 없이 숫자 값을 삽입하는 시퀀스를 만듭니다. 다음은 샘플 코드입니다:


시작 매개변수 -t272를 등록하세요

SQL Server Configuration Manager를 열어보세요. SQL Server 2012 인스턴스를 선택한 후 우클릭하여 속성 메뉴를 선택하세요. 팝업 창에서 발사 매개변수를 찾아서 -t272를 등록하세요. 완료 후에는 아래 그림에 나오는 SQL Server(SQLSERVER2012)를 재시작한 후, 문제가 해결되었는지 확인하기 위해 버그 재현 작업을 수행합니다.




추가 노트:

데이터베이스에 자기 팽창 테이블이 많고 모두 숫자 점프 문제가 있다면, 두 번째 방법을 사용하는 것이 더 낫습니다. 아주 간단하고 범위가 서버 수준이기 때문입니다. 두 번째 솔루션을 채택하면 이 서비스 인스턴스의 모든 데이터베이스에 영향을 미칩니다.





이전의:웹 서버는 상태 코드의 유형과 의미를 반환합니다
다음:SQL Server 데이터베이스에서 자가 성장 ID 열의 연산 메서드를 업데이트하세요
 집주인| 게시됨 2020. 7. 8. 오후 3:15:52 |
SQL Server 기능은 상위 버전에서 제공됩니다. 성능 문제로 1000개의 식별 값을 미리 '캐시'합니다
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com