Oracle Tip 게시판
안녕하세요. Oracle 에서 Parallel SQL 사용법에 대해서 간략히 알려드립니다.
대용량 작업의 경우 병렬처리는 작업시간을 줄여주는 고마운 존재 입니다.
물론 cpu 를 많이 가져다 쓰기 때문에 언제 어디서나 사용할 수 있는 방법은 아닙니다.
시스템의 사용을 내가 마음대로 해도 된다는 가정하에 memory, cpu를 마음껏 쓸 수 있다면 sort_area_size 를 늘려주고, 병렬처리를 할 때 투입될 cpu를 늘려준다면 작업시간이 단축될 것으로 예상됩니다.
병렬처리 적용 방법은 아래처럼 3가지를 일반적으로 말합니다.
1. Table 이나 index 속성에 Parallel 속성을 주면 모든 쿼리에 병렬처리가 적용됩니다. <- 일반적으로 이렇게 안씁니다.
2. seesion level에서 병렬 옵션을 주는 방법이 있다고 합니다.
3. Database level에서 병렬 옵션을 주는 방법이 있다고 합니다.
2. 의 경우는 서버마다 설정이 다르고 조건이 조금씩 다릅니다. DDL, DML, QUERY(SELECT) 를 수행하기 전에 alter session 으로 session 상태를 변경해야 합니다.
1.의 경우가 아닌 이상 병렬처리 hint를 주어야 병렬처리가 됩니다.
현재 Test는 3. 의 환경에서 합니다. Oracle 9i 입니다.
-- TLOG07TT 은 Partition Table 입니다.
SQL> explain plan set statement_id = 'SQL1' for SELECT COUNT(*) FROM TLOG07TT;
해석되었습니다.
경 과: 00:00:00.00
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'SQL1', 'TYPICAL'));
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Pstart| Pstop |
------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 99556 | | |
| 1 | SORT AGGREGATE | | 1 | | | | |
| 2 | PARTITION RANGE ALL| | | | | 1 | 14 |
| 3 | TABLE ACCESS FULL | TLOG07TT | 84M| | 99556 | 1 | 14 |
------------------------------------------------------------------------------------
Note: cpu costing is off
11 개의 행이 선택되었습니다.
경 과: 00:00:00.03
위의 경우는 Parallel 이 실행되지 않은 것입니다.
아래가 Parallel 사용 예 입니다.
SQL> explain plan set statement_id = 'SQL1' for SELECT /*+ PARALLEL(TLOG07TT 4)*/ COUNT(*) FROM TLOG07TT;
해석되었습니다.
경 과: 00:00:00.00
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'SQL1', 'TYPICAL'));
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Pstart| Pstop | TQ |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 24889 | | | | | |
| 1 | SORT AGGREGATE | | 1 | | | | | | | |
| 2 | SORT AGGREGATE | | 1 | | | | |99,00 | P->S | QC (RANDOM)|
| 3 | PARTITION RANGE ALL| | | | | 1 | 14 |99,00 | PCWP | |
| 4 | TABLE ACCESS FULL | TLOG07TT | 84M| | 24889 | 1 | 14 |99,00 | PCWP | |
----------------------------------------------------------------------------------------------------------------
Note: cpu costing is off
12 개의 행이 선택되었습니다.
위의 붉은색으로 표시된 부분이 병렬처리를 나타내는 부분입니다.
약자는 아래와 같습니다.
P->S : Parallel to serial
QC : Query coordinator
PCWP : Parallel combined with parent
Toad 에서는 실행계획은 Tree 형태로 보는 경우 좀 더 이쁘게 보입니다.
이 외에 PARALLEL_INDEX, INDEX_FFS 등을 사용하여 병렬처리를 지정할 수 있습니다.
^^
1. Partition table 아닌 Heap table의 경우는 INDEX FAST FULL SCAN 을 사용해야 병렬처리가 가능합니다.
2. 해당 hint에 정렬 순서를 지정할 수 있는 방법을 여기저기(OTN, psoug.org) 뒤져보았지만....
정렬 순서를 지정하는 hint나 hint에 속성으로 정렬을 지정하는 것은 발견하지 못했습니다.
아시는 분 계시면 좀 알려주세요. ^^

개인적으로.. MSSQL과 Oracle의 병렬처리를 비교하자면.... 사용법이 좀 다르다.. 정도??
Oracle 에서는 hint로 명시하지 않는 한 병렬실행이 되지 않는다는 믿음(?)이 있는데 비해 MSSQL은 통계수집이나 예상계획이 잘못되면 병렬실행이 되어 오히려 성능을 떨어뜨리는 상황이 발생할 수 있다는 것이 MSSQL의 병렬처리 부분에서 가장 쉽게 느껴지는 약점이 아닐까 합니다.
다른 분들은 어떻게 생각하십니까?
MSSQL은 MAXDOP옵션을 잘 사용해야죠 머...
오히려 병렬로 풀고 싶은데 강제로 실행할 수 있는 방법이 없어서 그게 더 불편해요...
그리고 오라클의 병렬 실행 처리는 메모리 사용 방법도 다른걸로 알고 있습니다.
일반적으로 디스크에서 읽어온 데이터는 다음 쿼리에 사용하기 위해서 메모리에 캐시하게 되는데 오라클의 병렬 처리는 캐시를 하지 않는걸로 알고 있습니다. 그래서 캐시 작업에 대한 부하가 줄기 때문에 좀더 빠른 처리가 가능하게 됩니다. 이걸 다이랙트 패스 리드'라고 했던거 같은데 가물가물 하네요;;
SQL SERVER는 병렬 처리시 메모리를 어떻게 관리하는지 잘 모르는데 혹시 알고 있으신분 있으시면 설명좀 해주세요 +_+
코난 김대우 입니다. 대단히 조심스럽습니다만, 오라클 관련 강좌 게시판이 당시 QnA로, 또는 광고 비슷하게 운영되었으며 - 관리 시삽이 행방 불명이라 개편하면서 부터는 아카이브 시켜 둔 상태 입니다.
http://www.sqler.com/bOracleTip
이 게시판이 MSSQL 기술 게시판이라 어떻게 해야 할지 살짝 걱정 되는데요... 괜찮으시다면 오후 정도에 http://www.sqler.com/bOracleTip 으로 옮겨 드리도록 하겠습니다. 감사합니다.
죄송합니다.
의도는 MSSQL의 병렬처리에 관련된 내용과 비교해 보고자 작성했습니다.
Oracle에서 이야기하는 병렬처리는 이러한 방식으로 하고 이렇게 사용한다.
MSSQL은 어떻게 동작하고 잘 사용하려면 어떻게 해야 한다 등의 이야기로 풀어갔으면 했습니다.
Oracle에서 실행계획 상으로는 병렬처리로 나오지만 실제 수행시 병렬로 실행되는지 확인을 하고는 하는데, MSSQL에서도 그러한 경우가 발생할 수 있는지.. 병렬로 실행되는 것을 확인하는 방법은 무엇인지.. 등에 대해서 이야기가 나올 것으로 예상했거든요...
흠.. 또한... MSSQL DBA로서 Oracle을 관리 및 사용할 때 병렬처리 시 번거로움도 있어서.. 그런 쪽으로 이야기가 되었으면 했습니다..
병렬처리가 가능한 조건이 제한적이기 때문에 사전에 조건에 맞는지 확인을 꼭 하고 Test 를 매우 많이 하지요..
그럼 수고하세요. ^^

코난
어설픈 지식으로 MSSQL의 병렬처리를 설명하기 보다는...
databaser.net에서 정리한 것을 보는 것이 더 괜찮을 듯 합니다.
http://databaser.net/moniwiki/wiki.php/%EB%B3%91%EB%A0%AC%EC%B2%98%EB%A6%AC%EC%9D%98%EA%B8%B0%EB%B3%B8
http://databaser.net/moniwiki/wiki.php/ParallelismEnhancementsInSQLServer2008