문제

일별 일정에 대한 업데이트 및 새로운 레코드와 병합되어야하는 매우 큰 데이터 (~ 3 백만 레코드)가 있습니다.나는 실제로 레코드를 1000 개의 레코드 덩어리로 분리시키고 데이터가 업데이트되는 동안 라이브 테이블을 잠그지 않도록 TEMP 테이블과 함께 TEMP 테이블을 사용하여 MERGE 명령을 사용하는 저장 프로 시저가 있습니다.문제는 그것이 정확히 도움이되지 않는다는 것입니다.테이블은 여전히 데이터에 액세스하려고 할 때 데이터를 사용하는 웹 사이트를 사용하는 웹 사이트를 사용합니다.나는 심지어 그것을 100 개의 레코드 덩어리로 분할하고 덩어리를 병합하는 것 사이에 일시 중지하는 데 도움이되는지 확인하기 위해 WAITFOR DELAY '000:00:5'를 시도했습니다.그것은 여전히 오히려 느린 것입니다.

테이블을 잠그지 않고 큰 데이터 세트를 병합하는 방법에 대한 제안, 모범 사례 또는 예제를 찾고 있습니다.

감사합니다

도움이 되었습니까?

해결책

프런트 엔드를 변경하여 을 선택할 때 NOLOCK을 사용하거나 커밋되지 않은 영향을 미치지 않습니다.

업데이트를 수행하기 위해 레코드를 레코드를 잠그면서 레코드를 잠글수록 삽입 또는 업데이트 할 수 없습니다.그러나 선택을 noLock 할 수 있습니다.

주의를 기울여야합니다.더러운 읽기가 괜찮다면 앞으로 나아가십시오.그러나 읽기에 업데이트 된 데이터가 필요하면 다른 경로를 낮추고 3M 레코드 병합이 문제가 발생하는 이유를 정확히 알아야합니다.

대부분의 시간이 병합 명령 중에 디스크에서 데이터를 읽거나 / 또는 낮은 메모리 상황을 중심으로 작업하는 것이 좋습니다.단순히 데이터베이스 서버에 더 많은 RAM을 채우는 것이 좋을 수 있습니다.

이상적인 양은 필요에 따라 전체 데이터베이스 전체를 메모리로 가져 오는 충분한 RAM을 갖는 것입니다.예를 들어 4GB 데이터베이스가있는 경우 8GB의 RAM이 있는지 확인하십시오. 물론 x64 서버에서.

다른 팁

나는 그 반대의 경험을 두려워합니다. 우리는 소스 테이블이 수백만에 있던 목표 테이블로서의 행 수의 일부만 만 있던 업데이트 및 삽입을 수행하고있었습니다.

전체 운영 창에서 소스 테이블 레코드를 결합한 다음 병합을 한 번 수행 한 다음 500 % 성능이 향상되었습니다. 이것에 대한 나의 설명은 단단한 루프에서 반복적이고 반복 대신에 병합 명령의 최대 전면 분석에 대해 지불하고 있다는 것입니다.

더 많은 경우, 400 행의 400 행이 400 개 이상의 별개로 7 백만 줄로 7 백만 행 (대상)으로 160 만 개의 행 (타겟)으로 합병 된 경우 SQL Server 엔진의 기능을 활용하는 것으로 확신합니다. 훨씬 낫다. 다시 한 번, 공정한 양의 작업은 두 개의 데이터 세트의 분석에 있으며 이는 한 번만 수행됩니다.

다른 질문은 Merge 명령이 소스 및 대상 테이블 모두에서 인덱스로 훨씬 더 잘 수행되는지 알고 있는지 여부를 알아야합니다. 다음 링크를 참조하십시오 :

http://msdn.microsoft.com. /en-us/library/cc879317(v=sql.100).aspx

개인적인 경험에서 병합의 주요 문제점은 페이지 잠금이므로 테이블에 지시 된 삽입물의 동시성을 배제합니다. 따라서이 길을 내려가면 단일 작가의 테이블을 치는 모든 업데이트를 일괄 처리하는 기본 사항입니다.

예를 들면 다음과 같이

삽입물은 입장 당 0.2 초의 미친 0.2 초를 가져 갔고, 대부분 거래 래칭에서 낭비되는 것처럼 보였으므로 병합을 사용하여이를 전환하고 일부 신속한 테스트는 0.4 초 또는 심지어 512 년에 256 개의 항목을 0.5 초 후에 삽입하고, 우리는로드 생성기로 이것을 테스트했으며, 생산을 칠 때까지 모든 것이 괜찮은 것처럼 보였고, 페이지 자물쇠에서 지옥에 차단 된 모든 것이 훨씬 낮아서 총 처리량이 훨씬 낮아집니다. 개별 삽입.

해결책은 단일 제작자의 항목을 병합 작업으로 일괄 배치 할뿐만 아니라 추가 수준의 대기열을 통해 단일 병합 동작으로 개별 DB로가는 제작자로부터 일괄 처리를 일괄 처리 (이전 연결 DB 당 MARS를 사용하여 모든 생산자가 실제 병합 트랜잭션을 수행하는 저장 프로 시저에 대한 모든 프로 시저를 인터리빙합니다.) 문제없이 초당 수천 개의 삽입물을 처리 할 수있었습니다.

모든 프런트 엔드 읽기에 NoLock 힌트가 항상 절대적으로 필요합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top