2011-01-21 3 views
0

시나리오 :TSQL 병합 성능

나는 약 2400 만 기록이있는 테이블이있다. 이 테이블에는 개별 고객과 관련된 가격 기록이 있으며 매일 계산됩니다. 매일 평균 6 백만 레코드가 있습니다. 매일 아침 가격표가 생성되고 가격 책정의 변경 사항을 반영하기 위해 병합 성명서가 실행됩니다.

병합 문은 변수 테이블에 삽입되는 전날의 이전 데이터로 시작되며 그 테이블은 실제 테이블로 병합됩니다. 가장 큰 문제점은 병합 구문이 꽤 오래 걸린다는 점입니다.

내 진짜 질문 변수 테이블 대 실제 테이블 대 임시 테이블을 사용하여 성능을 중심으로합니다. 이와 같은 대형 합병을위한 가장 좋은 방법은 무엇입니까?

+1

6M 행을 사용하는 RAM의 양에 따라 SQL Server에서 이미 테이블 변수를 임시 테이블로 변환 할 가능성이 있습니다. –

+0

매우 빠른 속도로 작성된 TLOG를 끕니다. 일괄 삭제로 처리했습니다. –

답변

2

생각들

나는 임시 테이블을 고려할 것입니다 : 이것들은 도움이되는 통계를 가지고 있습니다. 테이블 변수는 항상 하나의 행을 가진 것으로 간주됩니다. 또한 IO는 별도의 드라이브에 분리 될 수 있습니다 (별도로 tempdb가 있다고 가정).

단일 트랜잭션이 필요하지 않으면 MERGE도 DELETE, UPDATE, INSERT 시퀀스로 분할하여 작업량을 줄입니다. 각 작업에 필요한 (필요한 롤백 정보 및 잠금 량을 줄이는

+0

안녕하세요, 조금 명확히 말씀해 주시겠습니까? T-SQL MERGE 작업이 동등한 세 가지 개별 작업보다 비용이 많이들 것이라고 말하고 있습니까? –

+0

@ 존 손소 : 확실하지 않습니다. 그러나 Joe JFDI 패턴 http://stackoverflow.com/search?q=user%3A27535+JFDI를 작성하는 경우 병이 비쌀 수도 있음을 나타내는 몇 가지 자료 (@AaronBertrand?)를 읽었습니다. 말하자면, SQL Server 2012에서 MERGE를 많이 사용했는데 어떤 문제도 보지 못했습니다. – gbn

0

테이블에 대한 색인을 확인하십시오. 해당 테이블에 레코드를 추가/삭제할 때마다 인덱스가 업데이트됩니다.

레코드를 병합하기 전에 인덱스를 제거한 다음 병합 후에 인덱스를 다시 만들어보십시오.

+0

테이블의 인덱스가 너무 많아서 인덱스가 실제로 문제가되지 않습니다. 병합 명령문은 레코드를 아무 곳에 나 삽입하지 않으며 주로 내보내기를 위해 csv 파일에 기록되는 출력에 사용됩니다. –

+0

@kaiopur : 귀하의 성명서 "병합 성명서는 어디에도 레코드를 삽입하지 않습니다"라는 말은 귀하의 질문과 근본적으로 다릅니다. 몇 가지 코드를 게시해야합니다. – NotMe

+0

@kaiopur : 내 대답을 편집했습니다. – acermate433s

0

임시 테이블은 대용량 데이터 세트의 테이블 변수보다 성능이 좋을 수도 있습니다. 또한 임시 테이블에 데이터를 넣은 다음 인덱스 할 수 있습니다