오라클 시퀀스의 LAST_NUMBER
시퀀스 SEQ_PAGE_ID가 있습니다.
SEQUENCE_NAME INCREMENT_BY CACHE_SIZE LAST_NUMBER
-------------------------------------------------------
SEQ_PAGE_ID 1 20 2222292456
CASH_SIZE를 변경하기 위해 아래 스크립트를 사용했습니다.
alter sequence SEQ_PAGE_ID CACHE 5000;
제가 질문을 확인했을 때,
select ... from user_sequences where sequence_name = 'SEQ_PAGE_ID';
SEQUENCE_NAME INCREMENT_BY CACHE_SIZE LAST_NUMBER
-------------------------------------------------------
SEQ_PAGE_ID 1 5000 2222292447
그LAST_NUMBER
서에변된에서 경▁changed된경으로 변경되었습니다.2222292456
2222292447
이것이 변경된 스크립트 때문에 발생한 것입니까?
이건 정상이에요, 네.데이터 사전 보기에 대한 설명서에서last_number
다음과 같습니다.
디스크에 기록된 마지막 시퀀스 번호입니다.시퀀스가 캐시를 사용하는 경우 디스크에 기록된 숫자는 시퀀스 캐시에 마지막으로 배치된 숫자입니다.이 숫자는 마지막으로 사용된 시퀀스 번호보다 클 수 있습니다.
새 시퀀스로 재생성할 수 있습니다.
SQL> create sequence SEQ_PAGE_ID start with 2222292436 increment by 1 cache 20;
sequence SEQ_PAGE_ID created.
SQL> select sequence_name, increment_by, cache_size, last_number
2 from user_sequences where sequence_name = 'SEQ_PAGE_ID';
SEQUENCE_NAME INCREMENT_BY CACHE_SIZE LAST_NUMBER
------------------------------ ------------ ---------- -----------
SEQ_PAGE_ID 1 20 2222292436
SQL> select SEQ_PAGE_ID.nextval from dual;
NEXTVAL
----------
2222292436
SQL> select sequence_name, increment_by, cache_size, last_number
2 from user_sequences where sequence_name = 'SEQ_PAGE_ID';
SEQUENCE_NAME INCREMENT_BY CACHE_SIZE LAST_NUMBER
------------------------------ ------------ ---------- -----------
SEQ_PAGE_ID 1 20 2222292456
그last_number
캐시 크기만큼 상승했습니다. 정상입니다.
SQL> alter sequence SEQ_PAGE_ID CACHE 5000;
sequence SEQ_PAGE_ID altered.
SQL> select sequence_name, increment_by, cache_size, last_number
2 from user_sequences where sequence_name = 'SEQ_PAGE_ID';
SEQUENCE_NAME INCREMENT_BY CACHE_SIZE LAST_NUMBER
------------------------------ ------------ ---------- -----------
SEQ_PAGE_ID 1 5000 2222292437
그last_number
아래로 내려가지만, 이제 실제 생성된 마지막 시퀀스 번호를 반영합니다.DDL로 인해 Disk에 기록된 데이터가 캐시의 상위(이전 20값 캐시 또는 새 5000값 캐시)가 아닌 현재 값을 반영하도록 업데이트되었습니다.당신의 경우에는2222292447
그 말은 당신이 캐시를 통해 내가 실행했을 때보다 10개의 가치가 더 있었다는 것을 의미합니다.alter
.
디스크에 저장된 값은 데이터베이스가 충돌할 경우 선택할 위치를 알 수 있도록 크게 저장됩니다.된 "" " " " " "에서합니다.last_number
정상적인 실행 중에는 이를 다시 참조할 필요가 없으며 새 값이 캐시될 때 디스크의 값만 업데이트합니다.이렇게 하면 값을 실시간으로 유지하기 위해 값을 비싸게(느린) 잠금을 수행할 필요 없이 충돌 후 시퀀스 번호가 재발행되는 것을 방지할 수 있습니다. 결국 캐시가 피해야 하는 것입니다.
문제는 오직 다음과 같은 경우에만 있을 것입니다.last_value
실제 생성된 시퀀스보다 낮았지만 그럴 수는 없습니다. (음, 시퀀스가 사이클로 설정되지 않은 경우)
SQL> select SEQ_PAGE_ID.nextval from dual;
NEXTVAL
----------
2222292437
생성된 다음 시퀀스 번호는 캐시 크기가 변경되기 전의 마지막 시퀀스 번호에 이어 표시됩니다. 사전 값에서 우려했던 것처럼 이전 값을 재사용하지 않았습니다.
SQL> select sequence_name, increment_by, cache_size, last_number
2 from user_sequences where sequence_name = 'SEQ_PAGE_ID';
SEQUENCE_NAME INCREMENT_BY CACHE_SIZE LAST_NUMBER
------------------------------ ------------ ---------- -----------
SEQ_PAGE_ID 1 5000 2222297437
그last_number
이제 이전에 저장된 값이 캐시 크기인 5000만큼 증가한 것으로 표시됩니다.캐시에서 5000개의 값을 모두 사용하거나 데이터베이스가 바운스되거나 시퀀스가 다시 변경되는 등 영향을 미치는 다른 작업이 발생할 때까지 데이터 사전의 내용은 다시 변경되지 않습니다.
시퀀스가 캐시에 있을 때 last_number는 오라클이 유지하는 수를 나타냅니다.그렇지 않은 경우 Oracle에서 마지막으로 사용한 시퀀스를 나타냅니다.alter 명령을 사용하여 시퀀스 설정을 변경하면 Oracle이 "시퀀스 캐시"를 플러시할 수 있습니다.
여기 간단한 예가 있습니다.
SQL> drop sequence test;
Sequence dropped
SQL> create sequence test cache 20;
Sequence created
SQL> select last_number from user_sequences where sequence_name='TEST';
LAST_NUMBER
-----------
1
SQL> select test.nextval from dual;
NEXTVAL
----------
1
SQL> select last_number from user_sequences where sequence_name='TEST';
LAST_NUMBER
-----------
21
SQL> alter sequence test CACHE 5000;
Sequence altered
SQL> select last_number from user_sequences where sequence_name='TEST';
LAST_NUMBER
-----------
2
SQL> select test.nextval from dual;
NEXTVAL
----------
2
SQL> select last_number from user_sequences where sequence_name='TEST';
LAST_NUMBER
-----------
5002
SQL>
이 게시물은 마지막 번호를 변경하기 위한 것입니다 :)
seq xyz의 LAST_NUMBER가 3953이고 205233으로 변경하려면 시퀀스를 (205233 - 3953 = 201,280)만큼 증가시킨 다음 1을 증가시켜야 합니다. 다음 명령을 사용하여 이를 달성할 수 있습니다.
LAST_NUMBER를 다음으로 변경
ALTER SEQUENCE xyz INCREMENT BY 201280;
SELECT xyz.nextval from dual;
ALTER SEQUENCE xyz INCREMENT BY 1;
이제 LAST_NUMBER가 205233으로 업데이트됩니다.
언급URL : https://stackoverflow.com/questions/23631628/last-number-on-oracle-sequence
'programing' 카테고리의 다른 글
jQuery를 사용하여 브라우저 주소 표시줄 URL 변경 (0) | 2023.07.27 |
---|---|
Spring 시제품 스코프는 언제 사용해야 합니까? (0) | 2023.07.27 |
div 요소를 인라인으로 표시하려면 어떻게 해야 합니까? (0) | 2023.07.27 |
파이썬 세트 작업의 시간 복잡성? (0) | 2023.07.27 |
iPhone 6 / iOS 8에서 NFC 태그 읽기 (0) | 2023.07.27 |