본문 바로가기

병렬처리

오라클 병렬처리 Plan 개선 (PX SELECTOR) - Oracle 12c 신기능 Oracle 12.1 버전부터 병렬처리 실행계획(Plan) 상에 PX SELECTOR 라는 것이 추가되었습니다. QC(Query Coordinator)가 하던 역할을 일부 떼어서 Parallel Process 가 하도록 바꾼 것인데, 이렇게 바꾸면서 불필요하게 Buffer Sort 하던 작업을 없애버려 결과적으로는 약간의 성능이 개선되는 효과를 가져왔습니다. 아래에서 확인할 수 있는데, 왼쪽은 optimizer_features_enable 파라메타를 조정해서 11g 환경으로 세팅한 것이고, 오른쪽은 19c 환경입니다. 아래 SQL문을 11g 환경에서 실행했을때는 0.67초가 걸렸고, 19c 환경에서는 0.45초가 걸렸습니다. select /*+ monitor ordered parallel(a 4) */ .. 더보기
오라클 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.. 더보기
오라클 PL/SQL 함수(Function) 병렬처리 옵션 (parallel_enable) Oracle DB 내에서 PL/SQL "함수" 를 만들때 병렬처리 옵션을 줄 수가 있습니다. 병렬처리 옵션 주는 방법은 매우 간단한데, 효과는 엄청납니다. create function 함수 생성 문장에서 "parallel_enable" 문구만 뒤에 추가해주면 끝입니다. -- 함수 (싱글처리) create or replace function func_s (p_val number) return number is v_ret number; begin select dbms_random.value(1, p_val) into v_ret from dual; return v_ret; end; / -- 함수 (병렬처리) create or replace function func_p (p_val number) return n.. 더보기
오라클 병렬처리(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 을 한.. 더보기