현재 구성안을 그리고 있는데 하나의 장비A에서 3초에 한번씩 히스토리 테이블에 에 값을 삽입 합니다. 히스토리 테이블에 insert 발생시 장비A의 상태값을 현재장비상태 라는테이블에서 장비A의 값을 update 하는 트리거 를 작성 하려고 합니다 최대 장비 갯수는 300쯤 된다면 3-4초에 300번의 트리거 작동시 DB 서버에 과부하가 걸리지 않을까요? 과부하가 걸린다면 혹여 다른방법이 있을까요?
서버 스펙에 따라 틀리겠죠.
300개의 장비에서 동시에 3초에 한번씩 INSERT 하고 INSERT 대상 테이블에는 트리거가 걸려있음.
예상 가능한 부하는...
동시에 여러 세션에서 하나의 테이블에 DML 작업이 벌어지므로 대상 테이블을 HASH Partition하는 것이 부하 분산에 좋을 것 같습니다. 관리까지 염두에 둔다면 RANGE+HASH로 하는 것도 괜찮겠죠.
또 하나 대량의 DML 발생에 따라 다량의 Redo 발생, lgwr 에 병목이 생길 확률이 큽니다.
그리고 그 정도 TR이면 log file sync 대기가 높게 나올 수 있습니다.
따라서 redo, arch log는 RAID5 처럼 쓰기 성능이 느린 곳에 두지 말고 다른 I/O와 겹치지 않도록 가장 빠른 저장장치를 사용하시기 바랍니다.
(만약 instance crash시 약간의 데이터 유실을 감내할 수 있다면 10g R2부터 추가된 async commit, batch commit 기능을 사용해보시기 바랍니다. 다만 갑자기 DB가 죽을 경우 이미 commit된 TR 일부가 손실될 수 있습니다.)
async commit은 아래 링크를 참고 바랍니다.
파라미터 레벨 설정보다는 새로 추가된 commit write nowait batch 구문을 사용하시기 바랍니다.
주의 사항은 위에 적었다시피 이미 Commit된 데이터라도 DB가 갑자기 죽을 경우 일부 유실될 수 있다는겁니다.
실재로 제가 테스트 해본 결과 commit한 TR이 Redo log에 async하게 Write되므로 최근 일부가 유실되는 것을 관측하였습니다. 약간의 데이터 유실은 감내할 수 있다거나 수작업 복구가 가능하다면 사용해보시기 바랍니다. log file sync에 대한 대기를 획기적으로 줄일 수 있습니다.
http://www.orafaq.com/node/93