특히 테이블이 커지거나 많은 행을 업데이트해야하는 경우에는 RBAR보다 테이블 기반 처리가 항상 선호되어야한다는 것이 일반적인 통념입니다.다양한 트랜잭션 크기를 사용하는 RBAR 대 세트 기반 처리의 처리
하지만 항상 유지됩니까? 다른 하드웨어에서 몇 가지 상황을 경험했습니다. 세트 기반 프로세싱은 시간 소비면에서 기하 급수적으로 증가하는 반면, 동일한 작업 부하를 더 작은 청크로 분할하면 선형 성장이 가능합니다.
나는 완전히 틀린 것으로 증명되는 것이 흥미로울 것이라고 생각합니다. 분명하지 않은 것이 있거나, 그렇지 않다면, 작업량을 나누는 것이 노력할 가치가 있다는 것을 아는 것이 좋습니다. 이어서 어떤 지표가 어떤 접근 방법을 사용할 것인지 결정하는 데 도움이되는지 확인합니다. 나는 개인적으로 흥미로 다음과 같은 구성 요소를 기대 해요 :
- 작업 부하의 크기
- 크기와 로그 파일의 성장 RAM의
- 금액
기타를 DiskSystem는의
예제 1 : 나는 1200 만 개의 행 테이블을 가지고 있으며, 각 테이블에있는 하나 또는 두 개의 필드를 다른 테이블의 데이터로 업데이트해야합니다. 하나의 간단한 업데이트로이 작업을 수행하면 테스트 상자에서 약 30 분이 소요됩니다. 또한 여러 계산이 실질적으로 모든 행에 수행 한 필요가 200 만 개 행 테이블입니다 : 예 :
WHERE <key> BETWEEN 0 AND 1000000
WHERE <key> BETWEEN 1000000 AND 2000000
...
예 2 -하지만 내가 열두 덩어리로이 분할 24분 경우, ~에서 할 수 있습니다 . 한 번에 전체 세트를 수행하면 내 상자가 3 일 동안 실행되고 심지어 완료되지 않습니다. 정확히 동일한 SQL을 실행하기 위해 간단한 C#을 작성했지만 WHERE 절을 추가하여 한 번에 트랜잭션 크기를 100k 행으로 제한하면 ~ 14 시간 내에 완료됩니다. 기록을 위해
: 내 결과, 동일한 물리적 하드웨어에 휴식 같은 데이터베이스에서있는 통계 업데이트와 함께, 인덱스의 변경없이 단순 복구 모델은그리고 아니, 나는 시도하지 않은 등 '진정한'RBAR, 내가해야 할지라도 - 그것이 실제로 얼마나 걸릴지를 보는 것 일지라도.
12 개의 청크가 하나의 트랜잭션에 있습니까? – gbn
Nope, 별도로 커밋 된 트랜잭션. 사실, 24 분에는 Management Studio를 모니터링하고 WHERE 절을 편집 한 후 F5를 눌러 다음 청크를 실행합니다. –
나는 대답보다는 대답 할 것이다. 나는 정량화 할 방법이 없다. 하지만 트랜잭션이 크기가 커짐에 따라 성능이 저하 될 수 있고 (로그 파일 사용), 병합 조인을 사용할 수없는 대량의 테이블에 가입하지 않고 데이터를 디스크로 스풀링하거나 디스크에서 스풀링하는 경우 성능이 저하 될 수 있음을 알고 있습니다.). 그래서, 규모가 문제를 긍정적 인 단계로 깨뜨리는 경우가 확실합니다. 이는 "더티 상태"를 만들 수 있음을 의미합니다. DB의 일부가 업데이트되고 일부는 업데이트되지 않습니다. 문제를 해결하는 방법을 신중하게 선택하여 관리 할 수 있습니다. – MatBailie