2009-11-12 8 views
1

나는 장기간 작업이 있습니다. 처리 할 레코드는 100,000 개의 레코드가있는 테이블에 있습니다.쿼리 성능 도움말

이제 전체 작업 동안이 테이블을 쿼리 할 때마다이 100K 레코드를 쿼리합니다. 모든 레코드의 처리 상태가 동일한 테이블에 대해 업데이트됩니다.

알고 싶습니다. 레코드 상태를 업데이트 할 수있는 다른 테이블을 추가하면이 테이블에서 처리되는 레코드를 삭제하지 않고 계속 삭제할 수 있습니다. 마스터 테이블의 레코드 수를 줄이면 쿼리 성능이 향상됩니다.

EDIT : 마스터 테이블은 기본적으로이로드에만 사용됩니다. 플랫 파일을받습니다. 플랫 파일은 처리하기 전에 업로드합니다. 이 테이블에서 유효성 검사를 한 후에는 한 번에 하나의 레코드를 선택하고 데이터를 적절한 시스템 테이블로 이동합니다.

+1

큰 시스템 컨텍스트 없이는 대답하기가 매우 어렵습니다. 그 테이블이 사용되는 방법과 방법에 따라 달라집니다. –

+0

위의 내 의견을 참조하십시오 –

답변

3

테이블에 일반적으로 수백만 개의 행이있는 비슷한 성능 문제가 있었지만 마지막 실행이 시작된 이후 변경된 사항 만 처리하면됩니다. 내 목표 테이블에는 IDENTITY 열이 있습니다. 따라서 일괄 처리가 시작될 때 ID가 이전 배치 실행보다 큰 위치에서 선택하는 집합에서 최대 IDENTITY 값을 얻습니다. 그런 다음 배치 작업을 성공적으로 완료하면이 가장 높은 IDENTITY 값을 나타내는 별도의 테이블에 레코드를 추가하여 성공적으로 처리 한 후 다음 배치 호출의 시작 입력으로 사용합니다. (즐겨 찾기 테이블을 일반적인 용도로 추가하여 각기 고유 한 작업 이름을 가진 여러 작업을 각각 가지고 있습니다.)

레코드 당 처리 시간이 오래 걸리므로 잠금 문제가 발생하는 경우 위에서 사용했던 방법을 사용하지만, 세트를 1,000 행 (또는 시스템이 적시에 처리 할 수있는 행 청크 크기)으로 쪼개어 주어진 시간에 더 작은 세트 만 잠글 수 있습니다.

1

거의 포인터 (내 두 센트) :

은 "시스템 테이블"목적지에 따라 몇 가지 "중간"테이블에 기술 "천천히 치수 변화"와 유사한 해당 테이블을 분할 고려; 레코드별로 레코드 대신 시스템 테이블을 대량로드하십시오.

드롭 인덱스를 제거하기 위해 다시 만들 대량로드, 그리고 전에 "입력"테이블 등

로드하기 전에 해당 테이블에 불필요한 (키) 인덱스를 할당하지 마십시오.

대량 트랜잭션을 기록하지 말고 DB "복구 모델"을 대량로드 모드로 전환하십시오.

로드, 청소 및 유효성 검사에 SSIS (ETL) 작업을 사용할 수 있습니까?

UPDATE : 여기
은 일반적인 ETL 시나리오입니다 - 글쎄, 당신이 말하는 사람에 따라 달라집니다.

. ~ flat_file_1 (사용자가 가지고 있음)
클린flat_file_1 --> SSIS --> flat_file_2 (여기에서 확인할 수 있습니다)
.적합flat_file_2 --> SSIS --> flat_file_3 (모든 회사 표준 적용)
. 배달flat_file_3 --> SSIS (bulk) --> db.ETL.StagingTables (대상 당 여러 개)
4B. insert into destination_table select * from db.ETL.StagingTable (최종 목적지를 대량로드)

프로세스 (1-4)가 시간 초과되면 중간 파일에서 항상 시작할 수 있습니다. 또한 각 단계를 검사하고 SSIS에서 각 단계의 보고서 파일을 만들어 데이터 품질을 제어 할 수 있습니다. 운영 1-3은 본질적으로 느립니다. 여기서는 데이터베이스 외부에서 발생하고 있으며 별도의 서버에서 수행 할 수 있습니다. flat_file(1-3)을 보관하면 현재 진행중인 작업에 대한 감사 추적 기능을 사용할 수 있습니다. 디버그에도 유용합니다. :)

+0

레코드 단위로 수행 할 많은 검증이 있으므로 대량로드를 수행 할 수 없습니다. 현재 시스템의 복구 모델은 "단순"입니다. 벌크로드? 단순하다는 뜻이야? SSIS 도구는 SQL Proc를 실행하는 것보다 성능상의 이점이 있습니까? –

+0

DB 등록 정보/옵션 : 전체, 대량로드 및 단순 - 표준/엔터프라이즈 버전에 따라 다를 수 있습니다. SSIS는 유효성 검사를 수행하는 것이 좋지만 (생각에 따라 다르지만) SSIS에서 가능한 많은 작업을 수행 한 다음 거기에서 "중간"테이블을로드하는 것이 좋습니다. SQL "insert into ..."를 사용하여 데이터를 "중간"테이블에서 시스템 테이블로 이동하십시오. 중간 테이블을 동일한 데이터베이스에 보관하지만 스키마와 같은 ETL 스키마는 분리하는 것이 좋습니다. –