programing

Oracle RAC 및 시퀀스

linuxpc 2023. 7. 25. 20:41
반응형

Oracle RAC 및 시퀀스

저는 시퀀스를 사용하는 다양한 데이터베이스 애플리케이션을 보유하고 있습니다. RAC를 사용하지 않는 10g에서 RAC를 사용하는 11g으로 이러한 애플리케이션을 Oracle RAC로 마이그레이션하고 있습니다.순서가 필요하고 간격이 허용됩니다.

순서가 있는 캐시 시퀀스를 생각하고 있는데, 성능에 어떤 영향이 있는지 모르겠습니다.당신은 이것이 좋은 선택이라고 생각합니까?시퀀스 및 RAC에 대한 경험은 무엇입니까?

감사해요.

이 맥락에서 "질서 있는"이란 정확히 무엇을 의미합니까?

기본적으로 클러스터의 각 노드에는 시퀀스 번호 캐시가 별도로 있습니다.따라서 노드 1은 값 1-100을 전달하고 노드 2는 값 101-200을 전달할 수 있습니다.단일 노드에서 반환되는 값은 순차적이지만 노드 1의 세션 A는 15의 값을 얻을 수 있는 반면 노드 2의 세션 B는 107의 값을 얻을 수 있으므로 세션 간에 반환되는 값은 순서가 맞지 않는 것으로 나타납니다.

시퀀스를 정렬해야 한다고 지정하면 새 시퀀스 값을 요청할 때마다 Oracle이 노드 간에 통신해야 하기 때문에 시퀀스 캐시의 목적을 달성할 수 없습니다.따라서 상당한 양의 성능 오버헤드가 발생할 수 있습니다.시퀀스를 타임스탬프의 일종으로 사용하는 경우 오버헤드가 필요할 수 있지만 일반적으로 바람직하지 않습니다.

실제적인 측면에서 오버헤드 차이는 애플리케이션에 따라 크게 달라질 것입니다. 일부 애플리케이션에서는 측정할 수 없을 정도로 작고 다른 애플리케이션에서는 중요한 문제가 될 것입니다.RAC 노드의 수, 인터커넥트의 속도, 인터커넥트 트래픽의 양도 영향을 미칩니다.이는 주로 확장성 문제이기 때문에 실질적인 효과는 애플리케이션의 확장성을 제한합니다. 이는 본질적으로 비선형적입니다.애플리케이션에서 처리하는 트랜잭션 볼륨을 두 배로 늘리면 오버헤드가 두 배 이상 증가합니다.

NOCACH를 지정하는 경우 ORDER 또는 NOORDER를 선택하는 것은 기본적으로 중요하지 않습니다.ORDER를 지정하면 기본적으로 CACH 또는 NO CACH를 선택할 수 없습니다.따라서 캐시 노오더가 가장 효율적이며, 나머지 세 가지는 비교적 상호 교환이 가능합니다.시퀀스 값을 요청할 때마다 노드 간 조정 및 네트워크 트래픽이 모두 수반되며, 이는 분명히 잠재적인 병목 현상입니다.

일반적으로 타임스탬프 순서를 제공하기 위해 시퀀스에 의존하는 것보다 실제 타임스탬프를 저장하기 위해 테이블에 타임스탬프 열을 추가하는 것이 좋습니다.

요약

CACHE는 를사하시퀀성크능향수게있상다습니를 사용하는 시킬 수 .ORDER심지어 RAC에서도.

그것은 여전히 보다 빠르지 않습니다.NOORDER하지만 놀라울 정도로 가까울 수 있습니다.특히 시퀀스가 한 번에 한 노드에서만 사용되는 경우에는 더욱 그렇습니다.

테스트 케이스

SQL> create sequence cache_order cache 20 order;

Sequence created.

SQL> create sequence cache_noorder cache 20 noorder;

Sequence created.

SQL> create sequence nocache_order nocache order;

Sequence created.

SQL> create sequence nocache_noorder nocache noorder;

Sequence created.

SQL> set timing on
SQL> declare
  2     v_temp number;
  3  begin
  4     for i in 1 .. 100000 loop
  5             v_temp := cache_order.nextval;
  6     end loop;
  7  end;
  8  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:08.44
SQL> declare
  2     v_temp number;
  3  begin
  4     for i in 1 .. 100000 loop
  5             v_temp := cache_noorder.nextval;
  6     end loop;
  7  end;
  8  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:07.46
SQL> declare
  2     v_temp number;
  3  begin
  4     for i in 1 .. 100000 loop
  5             v_temp := nocache_order.nextval;
  6     end loop;
  7  end;
  8  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:35.15
SQL> declare
  2     v_temp number;
  3  begin
  4     for i in 1 .. 100000 loop
  5             v_temp := nocache_noorder.nextval;
  6     end loop;
  7  end;
  8  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:35.10

테스트 사례 참고 사항

2노드 RAC에서 결과를 얻었습니다.하나의 결과 세트만 표시되지만 다른 데이터베이스에서 테스트 사례를 여러 번 실행하여 거의 동일한 결과를 얻었습니다.

다른 노드에서 동시에 테스트를 실행했습니다.CACHE 향상되었습니다.ORDER 록비록▁the▁although.CACHE NOORDER 2상이보다 두 배 .CACHE ORDER.

과거에 다른 환경에서도 비슷한 동작을 보인 적이 있지만 결과는 없습니다.

왜요?

나는 왜 그런지 이해하지 않아요.CACHE다음과 같은 경우에 큰 차이가 있을 것입니다.ORDER를 전송하는 시간에 .숫자를 생성하는 데 걸리는 시간은 네트워크를 통해 데이터를 보내는 데 걸리는 시간과 비교할 때 무관해야 합니다.이는 Oracle이 알고리즘을 잘못 사용하고 있거나 제 테스트 케이스가 잘못되었다는 생각이 들게 합니다. (제 테스트 케이스에서 문제를 발견할 수 있는 사람이 있다면 알려주세요.)

또한 이 답변은 시퀀스를 생성하는 시간에 대해서만 설명합니다.를 사용하면 다른 이점이 있을 수 있습니다.NOORDER예를 들어, 여기에 설명된 대로 인덱스 경합이 감소합니다.

시퀀스는 의미와 함께 정렬되도록 설계되지 않았습니다.Tom Kyte의 답변과 그의 후속 답변에 대한링크를 확인하십시오.

언급URL : https://stackoverflow.com/questions/4866959/oracle-rac-and-sequences

반응형