ㅁ 상황
수백건정도의 데이터를 담고 있는 CBO 테이블 Z1, Z2, Z3, Z4, Z5... 가 있습니다.
(각각 테이블의 데이터가 수백만건입니다.)
각각 테이블의 데이터중 일부 필드값을 전체 컨버젼해야 합니다.
컨버젼하는 필드값은 Z1, Z2 에서는 key 값이고, Z3, Z4, Z5 에서는 일반 필드(인덱스아님)입니다.
ㅁ 궁금증1)
update (datab)
데이터 변환시 SM50 에서 모니터링하다보면 UPD process 를 거치지 않는 것으로 보입니다....
Z1~Z5 테이블 변환은 각각 다른 프로그램을 이용하며, 이 프로그램들은 동시에 background job으로 수행됩니다.
(수행시간이 꽤 깁니다... 몇시간 이상씩 소요됨)
각각 background job 은 BGD work process 를 하나씩 잡고 수행되구요... 이때 UPD process 가 1개일때와 2개일때
전체완료되는 시간에 차이가 별로 없더라구요....
커밋,변환 등의 작업이 BGD process 상에서 발생하던데....
일반 ABAP 구문으로 dbtab 변경시에는 UPD process 를 타지 않는 것인지요? -_-;;; (말이되는건가??)
(물론 BDC 와 같은 transaction 은 LUW 에 맞게 UPD 거치면서 커밋, 저장 되더라구요)
ㅁ 궁금증2)
나름 대용량 데이터 컨버젼시 가장 빠른 속도로 컨버젼 하는 방법은 무엇일까요?
a) 테이블의 내용을 전부 internal table 에 담은 후 loop 돌면서 1건씩 변경하고 update, commit 반복
b) "update (dbtab)
c) 오라클단에서 직접 DB 수정
d) 기타.
ㅁ 궁금증3)
실제 물리적서버가 여러대인데도 불구하고 1대일때보다 느린 경우는 어떤 문제가 있을 수 있을까요?
질문이 너무 막연하기 합니다만....
서버가 1개인 경우(당연히 DB, CI 한군데겟죠) 보다 서버가 4개인 경우(DB, CI는 같은서버, 나머지3대는 AP서버)
가 작업속도가 더 느립니다 -_-;;;;;;;;;;;;
(각각의 background job 은 서버4개인 경우는 서버당 골고루 분포;; 시켜서 작업했었습니다.)
(서버의 기계적 성능 역시 4개인 곳이 훨씬 좋습니다. 작업당시 접속자도 동일환경이었습니다. 변환작업외에 트랜잭션
발생이 안되었거든요)
너무 막연한 질문인줄은 아는데... 어떤 요소나 원인들을 예상할 수 있을까 해서요....
답답한 마음에 질문드립니다.
우문현답을 기다리겠습니다.
댓글 14
-
정군
2009.05.21 02:28
-
보나
2009.05.21 02:43
1번 같은 경우는 UPD work process 가 만약 테이블 update (insert, delete)에 영향을 미친다고 했을때,
프로그램들이 각각 1개씩 총 5개의 background 로 BGD work process 를 차지하고 있습니다.
물론 하는 일은 DB update 일거구요... 그럼 1개의 UPD work process 로 5개의 DB update 작업을 하는 것보다
(병목현상 같은게 일어나지 않을까 해서요...) 5개의 UPD work process 가 동작한다면 빨라져야 하지 않을까?
라는 생각이었구요...
3번 같은 경우에는... 서버의 갯수가 여러대면 (DB 서버가 1대라도) 속도가 차이가 없거나, 더 빨라야 한다는게 (기계적성능도좋으니)
제 생각이었는데.... 약 1.5~1.7배정도 느린 속도를 보여서요....
BC쪽에서도 정확한 원인?을 아직 찾지 못한 상황인데, 현재 상황이 제가 지켜만볼수는 없는 상황이라-_-;;;
이것저것 알아보는데... 전공분야?가 아니다 보니 모르거나 막히는 부분뿐이어서요;;;
-
보나
2009.05.21 03:04
2번 같은 경우도....
a) 셀렉트전체(1시간넘게걸림/테이블당)->인터널테이블에넣음(4GB넘는메모리양/테이블당)->수백만건루핑하며 변환 및 커밋
b) update (dbtab) 조건(데이터를 30번정도로 나누게되는 조건임) -> 1개의 조건들에 해당하는 양이 많아 읽고,변환,커밋에 오래걸림;
c) 오라클 직접 -> 아직 미시도함 (BC말로는 차이 없을거라함)
d) 기타 : 딱히 좋은 로직이 잘 안떠오름;;;;
위의 예제로는 5개의 테이블이지만, 실제로는 테이블 40개입니다. 천만건넘는건 데이터발췌부터 몇개로 쪼개서 프로그램을 여러번
돌리긴 하는데(수백만건 테이블들은 한번에? 처리하려고요)....
변환에 주어지는 시간은 많지 않고, 변환될 대상은 많아 (총 data row 로는 1억건 이상) 가장 최선의 방법이 무얼지..
-
보나
2009.05.21 03:08
3번의 경우 AP 서버가 문제라면,
작업시 DB-CI 서버 하나에서만 작업을 수행하는게 빠를까요?
(AP 서버는 꺼놓든지, 작업을 안하던지 하구요)
-
비리비리
2009.05.21 05:49
1번 Update Work Process는 업데이트용 펑션모듈 불러서 처리하실 때 사용되는 걸로 알고 있습니다..그냥 보통 디비 처리하듯이 하시면 Dialog process에서 처리할 겁니다..
2번은 대용량 처리하시는 경우는 업데이트 처리하시지 마시고 데이터를 삭제한 후 새로 Insert하시는 게 훨씬 빠릅니다..
3번은 잘 모르겠지만 서버 3대를 동기화시키는 데 문제가 있는 것 아닐까 싶네요..
-
하늘
2009.05.21 18:01
테이블에 사이즈가 클경우 inset, delete등 DML발생되는데는 시간이 오래소요됩니다... 데이타가 증가할수록요..
이럴때 HW적으로 튜닝을 하는 방법이 있는데 처음 설치하면 안하죠 ^^;;
그래서 대부분 테이블 리오그 작업을 통해 인덱스 밸런스를 유지합니다.
테이블에 많은 인덱스가 있을 경우 반드시 리오그를 해주시고 튜닝을 통하여 필요 없는 인덱스는 삭제해주셔야합니다.
질문에 대한 답변은 위분들이 해주셔서 성능에 대한 간단한 언급이었습니다. ^^;;;
-
슈퍼맨아들
2009.05.21 23:34
흠 상당히 난이도가 있는 질문이군요..
1) 일반 ABAP 구문으로 dbtab 변경시에는 UPD process 를 타지 않는 것인지요
-> 무조건 prcess가 실행됩니다..
2) 얘기를 하자면 길지만.. d)번이 정답입니다..
-> BC한테 요청하셔서 NATIVE SQL을 사용하는 것이 부하도 줄이고 DB딴에서 움직이기 때문에 성능이 바릅니다..
3) 실제로 제대로 BC분이 메모리세팅이나 기타세팅을 제대로 했다면..
-> 서버4개짜리가 서버1개짜리 서버보다 느릴이유가 없죠.. BC의 세팅을 잘못했다고 볼수 있습니다..
-
보나
2009.05.21 23:53
답변들 감사드립니다.
1) 의 경우 비리비리님과 슈퍼맨아들님의 답변이 다른것으로 보여지는데... ㅠㅠ;
아는 BC분에게 문의해봐도 SM50에서 안보이는 건 잘 모르겠다고 하시더라구요... UPD WP는 탈것같다고만 말씀하시는데...
UPD WP 가 증가함에도 불구하고 실제 DB변환의 속도에 차이가 없는 이유는 잘 모르겠어서....
만약 타지 않고 비리비리님 말씀처럼 DIA WP 혹은 BGD WP 에서 수행된다면,
DIA, BGD WP 자체적으로 DB와 통신?을 해서 update 가 이루어지는건가요...?
여러개의 WP 를 사용(병렬)하여 update 를 하는데도 속도향상이 이루어지지 않아서요...
2) 의 경우도 ㅠㅠ 답변달아주시는 분들 모두 다른 방향을 제시해 주셔서...고민이네요 ㅠㅠ
3) 의 경우에는 BC가 세팅을 잘못했으리라고 생각은되는데... '잘못된세팅부분'을 예상할만한 부분이 있을까 해서 드린 질문이었습니다.
AP서버를 추가해서 다시 테스트해볼 예정입니다만;;;;
테스트 자체에도 환경과 작업에 많은 공수가 들어가서요;;;
-
미소
2009.05.22 00:08
음 그런데..
DB가 1대라면, DB 1대가 단위시간 동안에 할 수 있는 일은 한정되어있지 않을까 하는데요.
AP를 늘린다고 1시간에 100건 처리하던 DB서버가 200건을 처리 할 수 없을 것 같은데
혹시 다른분들 의견은 어떠신지요?
-
보나
2009.05.22 00:15
미소//
최대성능의 제한은 있겠지만, 1)의 경우 WP를 1개만사용시에 그 최대성능까지의 작업이 안이루어질 것이다? 라는 생각으로
(UPD WP 1개로 1시간에 50건처리) WP 가 2개 (병렬)이면 성능향상이 있지 않을까 했었던 거구요(UPD WP 2개로 1시간에 100건처리)
예를 들어 BDC로 데이터 생성을 한다고했을떄도 프로그램을 나눠서 여러개의 WP 를 쓰면 총걸리는시간이 단축되는..뭐 이런것과
비슷하게요...
그리고 DB 서버가 어차피 1대, 100건/시간 이 최대일때,
AP3 대를 붙였으면 적어도 100건/시간 이 나와야 하는데, 70건/시간 이 나와서 3번 질문을 드렸던것입니다...;;;
-
하루나
2009.05.22 23:38
무슨 작업인지는 모르겠지만 단순히 DB내용만 컨버전한다면 병렬처리도 고민해 보시는것도 좋을듯 하네요.
예를 들어서 물류 DOCUMENT FLOW 테이블인 VBFA테이블을 일괄 수정할 일이 있었는데..
데이터가 엄청나죠.. 빌링 문서를 기준으로 엮여있는 문서들을 일괄 수정해야하는 일이었는데 총 데이터 9천5백만건중에서 빌링 백만건정도에 물린 수정데이터만 300만건이상 .. 그리고 관련 중간 로직과 기타 테이블들도 일괄 수정하는 일이었는데 1시간 반정도 걸리더군요.. 그때 사용한 Work Process가 한 50개 정도를 한번에 돌렸구요..
위 사항들을 고민해 보심도 좋지만 저희쪽은 Parallel Process로 해결했습니다.
내용도 Parallel Function 하나 생성해서 메인 프로그램을 호출하는 방법으로 햇는데 별로 어렵지 않습니다.
발상을 조금 전환하시는게 좋지 않을까 싶네요..
수고하십시요.
-
보나
2009.05.23 02:15
하루나// 병렬처리라 하시면 RFC 를 이용한 WP 의 여러개 생성을 말씀하시는건가요?
(하나이상의 시스템에 여러개의 WP 를 생성시키게 하는;;)
현재도 1천만건 이상의 데이터(테이블)들은 병렬처리로직반영되어 수행되고 있습니다.
변경대상 CBO테이블의 총갯수 50여개 (DB update, insert, delete 등)
BDC 여러개...(스탠다드 데이터 변경 관련)
현재만으로도 WP 를 수십개 이상 이미 잡아먹고 있습니다.;;; ㅠㅠ;;;
WP를 더 늘리는? 문제보다...
실제 Oracle DB에 어떤 방식?으로 들어가는지가 궁금해서요...
(서버가 여러대일떄 DB서버와 AP서버와의 관계? 쪽이나..이런부분들이요)
하루나님의 예와 같은 작업일 때, (병렬작업들이 전부 BGD WP 로 50개 사용하셨다고 할 경우,
ㅁ 서버의 총 BGD WP 는 50개가 수행중) UPD WP가 1개일때와 UPD WP가 50개일떄
작업속도의 향상이 발생하는 것인지? ←궁금증1
(덧붙이자면, UPD WP 가 일반 update dbtab 등의 구문과 BDC 에서 차이가 있는것인지?)
ㅁ (WP를 50개나 사용하셨다니 서버의 댓수가 여러개이실것 같아)
AP서버에서 수행되는 것과 DB서버에서 수행되는 것이 실제 DB로 들어갈 때 방식의 차이?←궁금증3
가 존재하는건지에 대한 궁금증이었습니다
-
정군
2009.05.23 04:54
보나님: 어쩌면 오라클 아키텍쳐들이나 답을 해줄 수 있는 문제 같습니다.
update process야 sap에서 생기는 거니 AP가 몇 대든 DB서버에서 동시에 그 업데이트 프로세스를 처리해 줄 수 없다면 속도가 개선 안되는 것은 당연할 듯 합니다.
비슷한 얘기들이 계속 되는 듯 해서 한가지만 더 생각나는 것을 적자면
index 값을 수정하는게 있다고 하신거 같은데, 그렇게 될 경우 db단에서 아무리 병렬로 돌아도
index가 생길 때마다 DB 쪽에서 다시 정렬하는 작업을 하기 떄문에 더 느려지지 않을까 싶습니다.
위에서도 나왔듯이 가능한 방법이라면 일괄 삭제후 insert도 괜찮은 방법입니다.
-
보나
2009.05.23 06:46
정군 // 답변감사드립니다. 프로그램로직 쪽으로도 여러가지 테스트중입니다. (삭제후 생성과 같은 방법이요)
(index 는 건드리지 않습니다. index, key등이 관련있는 테이블은 삭제-생성 방법을 이용했습니다)
여러가지 테스트를 더 해봐야겠네요 ^^;;
BC쪽에서도 여러방법을 물색중이구요;;;
몇시간내로 저 데이터를 다 처리해야되는거라...;;
답변달아주신분들꼐 감사드립니다. (__*)
주말 잘 보내세요 ^^
질문이 너무 고급이라.. 아키텍쳐를 잘 아는 사람이 아니면 답을 드리기 어려울 듯 하네요.
2번: 장단이 있겠지만, 수 시간이 걸리는 걸 한번에 commit을 하는 것도 위험할 듯 하네요.
제 생각엔 1만 건 단위로 internal table에서 일괄 update and commit을 하는게 좋지 않을까 싶습니다.
1, 3번: 그냥 제가 드는 생각으로는 AP 서버가 몇 대였든 간에 결국 DB 서버에서 commit이 일어나고 결과를 돌려주기 때문에 AP 서버들이 대기를 해야하니 시간은 비슷하지 않을까 싶습니다.(update process마 같은 맥락..)