programing

Oracle Sequence 값이 순서화되지 않았습니다.

css3 2023. 11. 1. 22:30

Oracle Sequence 값이 순서화되지 않았습니다.

중복 가능:
오라클 RAC 및 시퀀스

로컬 환경에 Oracle RAC가 구성되어 있습니다.nextVal에서 생성된 번호가 오더되지 않는다는 Sequence의 문제점을 분석하였습니다.첫 번째 값을 1로 얻는 경우, 두 번째 값을 얻는 경우를 21로 가정합니다(기본 CASH 20 및 NOORDER와 같이 시퀀스를 구성했습니다).

검색해보니 순서를 정해야 하는 해결책을 발견했습니다.저는 어떤 것을 선택하는 것이 더 나은지 의문이 있습니다.

1) 캐시 앤 오더

2) 캐시 및 주문 없음

위 중 어떤 것이 더 나은 옵션이고 그 이유는 무엇인지 알고 싶습니다.

둘째, ORDER/NOORDER와 상관없이 시퀀스를 NOCACH로 변경하면 주문이 가능합니까?

감사해요.

둘째, ORDER/NOORDER와 상관없이 시퀀스를 NOCACH로 변경하면 주문이 가능합니까?

각 증분에서 sys.seq$ 테이블에 쓰기를 강제로 수행하기 때문에 NOCACH가 효과적으로 순서화되므로 노드를 통해 직렬화해야 합니다.

--

저는 그 가능한 중복으로 수락된 답변에 이의를 제기할 것입니다.RAC에는 CASH + ORDER와 NOCACH가 크게 차이가 납니다.캐시를 순서로 부정하는 것이 아니라 캐시의 효과를 줄이는 것입니다.저는 한 번에 여러 노드에 액세스하고 NOCACH를 시퀀스 상에서 사용하면서 중간 계층 애플리케이션의 성능이 크게 저하되는 것을 직접 목격했습니다.우리는 그들의 시퀀스를 ORDER CASH로 전환했습니다 (그들이 원하는 대로 인종 간 순서를 바꾸었습니다).성능이 획기적으로 향상되었습니다.

요약하면 다음과 같습니다.시퀀스 속도는 "CACH NOORDER"->"CACH ORDER"로 가장 빠른 속도에서 가장 느린 속도로, "NACH ORDER"보다 훨씬 뒤에 있습니다.

이 또한 쉽게 테스트할 수 있습니다.

그래서 우리는 표준적인 순서로 시작합니다.

SQL> create sequence daz_test start with 1 increment by 1 cache 100 noorder;

Sequence created.

즉 순서가 없는 CASH.이제 두 세션을 시작합니다.이 테스트에서 4노드 RAC 데이터베이스 10.2.0.4를 사용하고 있습니다.

저의 시험 대본은 단순합니다.

select instance_number from v$instance;              
set serverout on
declare                                                     
 v_timer   timestamp with time zone := systimestamp;  
 v_num number(22);                                    
begin                                                  
 for idx in 1..100000                                 
 loop                                                 
   select daz_test.nextval into v_num from dual;      
 end loop;                                            
 dbms_output.put_line(systimestamp - v_timer);        
end;                                                   
/ 
/

이제 첫 번째 테스트(CACH NOORDER)를 실행합니다.

SESSION 1                                       SESSION 2
SQL> @run_test                                  SQL> @run_test

INSTANCE_NUMBER                                 INSTANCE_NUMBER
---------------                                 ---------------
              2                                               1


PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.


PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

SQL> @run_test                                  SQL> @run_test

INSTANCE_NUMBER                                 INSTANCE_NUMBER
---------------                                 ---------------
              2                                               1

+000000000 00:00:07.309916000                   +000000000 00:00:07.966913000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

+000000000 00:00:08.430094000                   +000000000 00:00:07.341760000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

그래서 7-8초만에 100,000번의 순서를 선택할 수 있습니다.

이제 NOCACH를 시도해 보겠습니다(시퀀스에 대한 모든 호출에 대해 seq$에 쓰기를 강요하므로 ORDER 대 NOORDER는 이와 무관함).

SQL> alter sequence daz_test nocache;

Sequence altered.

SESSION 1                                       SESSION 2
SQL> @run_test                                  SQL> @run_test

INSTANCE_NUMBER                                 INSTANCE_NUMBER
---------------                                 ---------------
              2                                               1

+000000000 00:08:20.040064000                   +000000000 00:08:15.227200000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

+000000000 00:08:30.140277000                   +000000000 00:08:35.063616000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

그래서 같은 작업 세트를 8초에서 8분으로 늘렸습니다.

CASH + ORDER는 어떻습니까?

SQL> alter sequence daz_test cache 100 order;

Sequence altered.

SQL> @run_test                                  SQL> @run_test

INSTANCE_NUMBER                                 INSTANCE_NUMBER
---------------                                 ---------------
              2                                               1

+000000000 00:00:25.549392000                   +000000000 00:00:26.157107000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

+000000000 00:00:26.057346000                   +000000000 00:00:25.919005000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

요약하면 100,000개의 단일 호출 페치에 대해 CASH NOORDER = 8초 NOCACH = 8분 CASH ORDER = 25초

캐시 순서의 경우, Oracle은 RAC 노드 간에 많은 ping을 수행하지만, 메모리에서 모두 수행되는 것처럼 캐시 크기가 다 사용될 때까지 seq$에 내용을 다시 쓸 필요는 없습니다.

제가 당신이라면, 적절한 캐시 크기(p.s. 높은 캐시 크기는 박스 메모리에 부하를 주지 않습니다. 오라클이 모든 숫자를 RAM에 저장하지 않고 현재 + 최종 숫자만 저장하기 때문입니다.)를 저장하고 필요한 경우 ORDER를 고려합니다.

언급URL : https://stackoverflow.com/questions/13513936/oracle-sequence-value-are-not-ordered