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
'programing' 카테고리의 다른 글
MySQL, Grails 2 앱을 사용하지 않는 동안 풀링된 연결을 지속적으로 유지하는 올바른 방법(또는 풀링된 연결의 시간을 초과하고 새 연결을 얻는 방법) (0) | 2023.11.01 |
---|---|
C++에서 더블을 문자열로 변환하려면 어떻게 해야 합니까? (0) | 2023.11.01 |
도커 컨테이너 실행과 시작의 차이점 (0) | 2023.11.01 |
XML-RPC와 SOAP의 차이점은 무엇입니까? (0) | 2023.11.01 |
워드프레스 WP_QUERY를 위해 $_POST를 소독하는 방법은? (0) | 2023.11.01 |