본문 바로가기

Parallel

오라클 Parallel DML 주의 사항 (ORA-12838 : cannot read/modify) 병렬 DML 작업 후에 갑자기 select 가 에러나는 황당한 경험을 하게 되는 경우가 있습니다. 보통 Oracle 에서는 어떤 DML 도 조회(Select)에는 영향을 주지않는다는 확신을 가지고 있는 사람들이 많은데, Parallel DML 은 예외입니다. Parallel DML 후에 commit 이나 rollback 을 해주지 않으면 아래와 같이 ORA-12838 에러를 만나게 됩니다. 조회(Select) 만 저렇게 에러가 나는게 아니라, 해당 Table 에 TM Lock 을 걸어버리기 때문에 다른 DML 도 안됩니다. $ oerr ora 12838 12838, 00000, "cannot read/modify an object after modifying it in parallel" // *Cause.. 더보기
오라클 병렬처리(Parallel Processing)관련 주의사항 (의도하지 않은 병렬수행, default degree) 지난번 포스팅에서 Table 에 설정된 degree 값을 주의깊게 봐야한다고 설명드린 적이 있는데, 그 값이 특정 숫자가 아니라 "default" 라고 되어 있는 경우도 주의가 필요합니다. 아래와 같이 TEST_X1 테이블에 degree 값이 "default" 로 되어 있는 것을 확인할 수 있습니다. 이 default 의 의미가 위험합니다. 병렬처리에서 default 값은 cpu_count x parallel_threads_per_cpu 로 계산됩니다. 저는 테스트서버로 cpu_count 값이 4밖에 안되지만, 실제 운영시스템의 경우는 보통 24, 48, 96 정도로 꽤 큰 값입니다. 여기에 x 2 (parallel_threads_per_cpu) 를 하기때문에, 아주 많은 병렬프로세스를 띄우게 되는 불상.. 더보기
오라클 병렬처리(Parallel Processing)관련 주의 사항 (degree) Oracle DB에서 user_tables, user_indexes 딕셔너리를 조회해보면 degree, instances 라는 컬럼이 있습니다. 이 컬럼들은 병렬처리를 자동으로 해주는 용도로 사용되는 컬럼입니다. degree 컬럼값이 8인 테이블이 있으면 이 테이블을 Full Scan 하는 경우 자동으로 Parallel 8 로 처리한 효과를 줍니다. instances 는 RAC 의 경우에 여러 노드에서 병렬처리를 할 수 있도록 해주는 역할을 하는 것이구요. DW 시스템 같은 곳에서는 유용할 수도 있으나, OLTP 환경에서는 주의해야 하는 부분이죠~ OLTP 에서 시도 때도 없이 병렬처리를 지맘대로 했다가는 장애 나기 십상입니다. 그래서 table 이나 index 에 degree, instances 값이 .. 더보기
오라클 병렬처리(Parallel Processing) 개념 및 용어 정리, 종합페이지 Oracle DB 에서 SQL문을 만들면서 빠르게 실행하기 위해서 우리는 튜닝(Tuning)을 합니다. SQL튜닝을 하다하다 마지막으로 시도하는 것이 "병렬처리(Parallel Processing)" 입니다. 마지막으로 시도하는 이유는 이게 시스템 자원을 많이 쓰기 때문입니다. 1개의 SQL문을 처리하기 위해 1개의 프로세스를 띄워서 일해야 하는데, 빨리 실행하기 위해 8개, 16개, 50개, 100개의 프로세스를 병렬로 동시에 띄워서 내 SQL을 처리합니다. 당연히 빠르겠죠~ ㅎㅎ 하지만, 이렇게 병렬로 실행하도록 만들어 놓은 SQL을 한꺼번에 여러명이 동시에 실행해버리면??? 다이~ 죽을 수 있습니다. DB가.. 시스템이 뻗을 수 있습니다. ㅋㅋ 당연히 병렬처리 기술을 사용할 때는 SQL이 동시에 많.. 더보기
병렬처리, Parallel Join 에서 /*+ pq_distribute(,,) */ 힌트 /*+ pq_distribute */ 힌트는 오라클DB에서 Parallel Join 시에 사용할 수 있는 힌트입니다. 두 테이블 이상 조인하는 SQL문에서 /*+ parallel(8) */ 힌트를 주게되면 병렬프로세스간에 조인이 발생합니다. 이때 조인하는 방식이 여러가지가 있습니다. 한쪽 테이블의 데이터를 모든 병렬서버들에게 전달하는 브로드캐스트(broadcast) 방식, 양쪽 테이블 데이터에 해시함수를 적용해서 해시값을 구한후 이것들을 가지고 조인하는 방식, 조인되는 테이블이 파티션 되어있는 경우 파티션 Wise Join 을 하는 방식. 이런식으로 옵티마이저(Optimizer)가 여건에 따라 선택할 수 있는 몇가지 조인옵션이 있습니다. 물론 위 중에서 어떤 것을 선택할지는 옵티마이저가 알아서 판단해서 .. 더보기
오라클 Parallel DML 처리 방법 및 주의 사항 - enable parallel dml Oracle DB 에서 병렬처리 작업시 /*+ parallel(...) */ 힌트를 사용합니다. 조회 Query SQL 이나 Insert/Update/Delete/Merge 같은 DML SQL 이나 Parallel 힌트 주는 것은 똑같습니다. 근데, Parallel DML 의 경우 깜빡하는 부분이 alter session 을 해주는 부분입니다. Insert/Update/Delete/Merge 같은 DML SQL 을 병렬처리 하고자 하는 경우에는 반드시 alter session parallel dml enable; 을 해줘야 병렬로 동작합니다. 12c DB 부터는 이걸 힌트에 삽입할 수 있는 방법이 생겼습니다. /*+ enable_parallel_dml */ 과 같이 해주면 alter session 을 한.. 더보기
오라클 Parallel 병렬처리 Default DOP (Default Degree of Parallelism) 앞에서 Oracle DOP 에 대해서 살펴봤습니다. 이번에는 Default DOP 에 대해서 체크해보겠습니다. DOP는 병렬도였죠. Default DOP 는 말그대로 디폴트로 잡히는 병렬도입니다. 아래에서 EMP 테이블에 parallel 옵션을 주어 degree 를 변경했습니다. 이때, parallel 뒤에 DOP 값을 명시하지 않았습니다. 이렇게 DOP 값을 명시하지 않을 때, Default 로 잡히는 DOP 값을 Default DOP 라고 부릅니다. 그럼, Default DOP 는 어떻게 결정될까요? For a single instance, DOP = PARALLEL_THREADS_PER_CPU x CPU_COUNT For an Oracle RAC configuration, DOP = PARALLEL.. 더보기
오라클 병렬처리 Parallel DOP (Degree of Parallelism) DOP 란 Degree Of Parallelism 의 약어로, 병렬도라고 합니다. 병렬처리할 때 병렬프로세스를 몇개 띄울 것인지를 의미합니다. DOP 가 20 이면 20개의 병렬프로세스를 띄워서 작업한다는 의미입니다. 오라클에서 병렬처리는 DB서버의 자원(CPU, Memory, Disk I/O)을 최대한 사용해서 작업을 빠르게 끝낼 수 있는 아주 유용한 기능입니다. 하지만, 조심해야 할 부분이 하나의 작업에 대해서만 병렬처리를 하면 문제없지만, 동시에 수십개의 병렬처리가 돌아가는 상황이 발생한다면? ㅋㅋ 장애로 이어질 수 있겠죠... 이런 일이 종종 발생합니다. 개발자가 어플리케이션의 SQL에 /*+ parallel */ 힌트를 박아놨는데, 이 어플리케이션이 뜻하지 않게 너무 많이 실행되는 경우 ㅎㅎ 난.. 더보기