programing

오라클 시퀀스의 LAST_NUMBER

powerit 2023. 7. 27. 22:25
반응형

오라클 시퀀스의 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된경으로 변경되었습니다.22222924562222292447이것이 변경된 스크립트 때문에 발생한 것입니까?

이건 정상이에요, 네.데이터 사전 보기에 대한 설명서에서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

반응형