2008-10-22 11 views
1

큰 AIX 메인 프레임에서 실행되는 메인 시스템이 있습니다. 시설보고 및 운영에는 야간 덤프가 메인 프레임에서 SQL Server로 진행되므로 각 50 개 고객은 동일한 스키마로 자체 데이터베이스에 있습니다. 이 덤프는 매일 밤 마칠 때까지 약 7 시간이 걸리고 실제로 할 수있는 일이별로 없습니다. 애플리케이션 공급 업체가 제공 한 것과 관련되어 있습니다.새 데이터베이스 테이블 가져 오기

SQL 서버로 덤프 한 후이를 사용하여 다른 여러 가지 일일 절차를 실행합니다. 이러한 절차 중 하나는 일종의 관리보고 샌드 박스 테이블로 데이터를 가져 오는 것입니다.이 테이블은 여러 데이터베이스에서 특히 중요한 테이블의 레코드를 하나의 테이블로 결합하여 SQL을 모르는 관리자가 임시 보고서를 실행할 때 사용할 수 있습니다 시스템의 나머지 부분을 망칠 필요없이. 이것은 다시 비즈니스 측면입니다. 관리자는 그것을 원하고 구현하는 것을 볼 수있는 힘이 있습니다.

이 표의 가져 오기 프로세스는 자체적으로 몇 시간이 걸립니다. 50 개의 데이터베이스에 분산 된 4 천만 개의 레코드를 약 4 백만 개의 레코드로 필터링 한 다음 검색을 위해 특정 열에 인덱스를 지정합니다. 결합 된 시간에도 초기로드 시간의 3 분의 1 미만이지만 야간 처리를 위해 시간이 부족하고 메인 프레임 덤프를 제어하지 않으며이를 제어합니다. 그래서 기존 절차를 개선 할 방법을 모색하는 임무를 맡았습니다.

현재 각 클라이언트 데이터베이스의 모든 데이터를로드 한 다음 나중에 한 번에 색인을 생성한다는 것이 철학입니다. 또한 장기간 실행되는 경우 다른 중요한 시스템을 중단시키는 것을 피하기 위해 더 큰 클라이언트 몇 대가 항상 먼저 실행되도록 설정됩니다 (테이블의 주 인덱스는 clientid 필드로 이루어짐). 우리가하기 시작한 한 가지 다른 점은 각 클라이언트가 순차적으로 진행되는 것이 아니라 한 번에 여러 클라이언트의 데이터를 동시에로드하는 것입니다.

제 질문은이 테이블을로드하는 가장 효율적인 방법은 무엇입니까? 나중에 색인 생성이 더 효율적이라고 생각하는 것이 맞습니까? 또는 데이터를 가져 오기 전에 색인을 생성해야합니까? 큰 고객이 아닌 페이지를 대량으로 재주문하지 않으려면 인덱스 순서로 테이블을로드해야합니까? 병렬로 로딩하면 한꺼번에 많은 디스크에 액세스하거나 명령을 제어 할 수있는 능력을 제거함으로써 상황을 악화시킬 수 있습니까? 다른 아이디어?

업데이트
음, 뭔가 업입니다. 나는 하루 중 일부 벤치마킹을 할 수 있었고, 인덱스가 작업의 시작이나 끝에서 생성되는지 여부는로드 시간에 전혀 차이가 없었지만 인덱스 자체를 구축하는 시간을 절약합니다. 코스는 테이블에 데이터가 없어도 거의 즉시 구축됩니다.)

답변

0

내가 알고있는 한, 당신은 정확합니다. 레코드를 모두 한 번에 추가 한 다음 끝에 한 번 색인을 만드는 것이 훨씬 좋습니다.

1

SQL Server에서 대량 데이터 집합을로드하는 작업을 꽤 많이 했었습니다. 삽입하는 동안 인덱스에서 성능 테스트를 한 후 나중에 추가했습니다. 필자는 FAR을 사용하여 모든 데이터가로드 된 후 인덱스를 만드는 것이 훨씬 더 효율적이라는 것을 발견했습니다. 우리의 경우 마지막에 추가 된 인덱스로로드하는 데 1 시간이 걸렸고 인덱스를 추가하여로드하는 데 4 시간이 걸렸습니다.

데이터를 가능한 한 빨리 이동시키는 것이 중요하다고 생각합니다. 순서대로로드하면로드 시간 대 색인 시간에 통계가 있습니까? 그렇게한다면 사물의 측면에서 조금 실험 해 볼 수 있습니다.

1

라이브 인덱스가 데이터베이스의 모든 행에 대해 여러 개의 I/O를 생성하므로 인덱스를 삭제 한 상태에서로드하는 것이 좋습니다. 4 백만 행은 테이블 파티셔닝을 통해 큰 이익을 얻지 못할 정도로 작습니다.

bcp를 사용하여 데이터를 준비 영역으로로드하고 여러 작업을 병렬로 실행하면 성능이 향상됩니다 (SSIS가이를 수행합니다). 필요한 경우 파일 경로 (및 테이블 이름)를 사용하고 SSIS의 '프로세스 실행'작업으로 6 개의 스레드에서 일련의 작업을 호출하는 bcp 용 일반 배치 파일 래퍼를 작성하십시오. 50 개의 일자리에 대해서는 데이터 기반 부하 컨트롤러 프로세스를 작성하는 것은 가치가 없을 것입니다. 모든 작업을 명시 적으로 유지할 필요가 없도록 이러한 작업을 시퀀스 컨테이너로 정리하십시오.

인덱스를 삭제하고 다시 만들어야 프로세스가 진행되는 동안 I/O 양이 크게 줄어들 수 있습니다.

50 개 소스가 동일하게 취급되는 경우 공통 테이블에로드하거나 스테이징 테이블에 분할 된 뷰를 작성하십시오.

1

끝에 색인, 예. 트랜잭션 로그에 대한 쓰기를 최소화하려면 로그 수준 설정을 BULK LOGGED로 설정하는 것도 고려하십시오. 완료 한 후에 다시 FULL로 설정하는 것을 잊지 마십시오.

관련 문제