2011-08-17 2 views
2

예약 된 작업에서 다음 SQL (SQL Server 2008)을 주기적으로 실행해야합니다. 쿼리 계획은 오라클 서버에서 데이터를 가져온 후 정렬 인 53 %의 비용을 나타냅니다. 그러나 나는 오픈 쿼리에서 데이터를 주문했습니다. 병합 병합시 정렬하지 않도록 쿼리를 강제 설정하는 방법 오픈 쿼리에 대한 주문 힌트가 있습니까?

merge target as t 
using (select * from openquery(oracle, ' 
     select * from t1 where UpdateTime > ''....'' order by k1, k2') 
    ) as s on s.k1=t.k1 and s.k2=t.K2 -- the clustered PK of "target" is K1,k2 
when matched then ...... 
when not matched then ...... 

bulk insert의 " with (order({ column [ ASC | DESC ] } [ ,...n ]))"와 같은 뭔가가 있나요? merge 문이있는 경우 쿼리 계획을 개선하는 데 도움이됩니까?

오라클 테이블에 이미 K1, PK에 PK가있는 경우 목표로 oracle.db.owner.tablename을 사용하는 것이 더 좋을까요? (SQL Server는 Oracle 메타 정보에서 색인을 찾습니다.)

또는 내가 할 수있는 최선의 방법은 로컬 임시 테이블에 oracle 데이터를 저장하고 K1, k2에서 클러스터 된 기본 키를 생성하는 것입니까? 언젠가 리턴 된 openquery 데이터 세트가 클 수 있기 때문에 임시 테이블을 작성하지 않으려 고합니다.

답변

1

필자가 필요로하는 인덱스를 만들 수 있기 때문에 테이블을 만드는 것이 가장 좋은 방법이라고 생각합니다. 그러나 임시 테이블을 사용해야하는 이유는 없습니다. 왜 영구적 인 스테이징 테이블을 만들지 않습니까? 로컬 인덱스를 사용하는 로컬 조인은 원격 쿼리 결과에 대한 조인보다 훨씬 효율적입니다. 물론 알기위한 유일한 방법은 테스트하고보아야합니다.

많은 수의 행이 염려된다면 새로운 행이나 변경된 행만 복사하여 볼 수 있습니다. 오라클 테이블에 행 생성 및 업데이트 시간에 대한 열이 이미 있으면 매우 쉽습니다.

또는 예약 된 작업 대신 SSIS를 사용할 수도 있습니다. SSIS를 아직 사용하고 있지 않다면 배우는 데 시간을 투자하고 싶지 않을 수도 있지만 매우 강력한 도구이며 대량의 데이터를 MSSQL으로 옮길 수 있도록 설계되었습니다. 다음 워크 플로우 패키지를 만들 것입니다 :

  1. 오라클
  2. 에서 (증분을 채울 수없는 경우에만) 스테이징 테이블에서
  3. 복사 기존 데이터 행을 삭제 MERGE 문을 실행
+0

감사합니다. 기본적으로 SQL Server에 Oracle 테이블 복사본이 필요하므로 추가 준비 테이블이 너무 많이 보인다. 위의 세 단계를 수행하여 SSIS 패키지가 TSQL 문에서 성능을 떨어 뜨 립니 까? 유일한 차이점은 (2)입니까? SSIS는 새로운 데이터가 많은 경우 데이터를 더 작은 조각으로 분할 할 수 있습니다. 또한 병합 데이터 흐름 변환은 추가 테이블을 만들지 않고도 빠르게 진행됩니까? – ca9163d9

+0

SSIS에서 병합 변환을 사용하지 않습니다. 필자는 오라클의 데이터를 영구 테이블에 복사하고 SQL 실행 태스크를 사용하여 이미 수행 한 것처럼 TSQL 병합을 수행합니다. 성능 질문에 대답하는 유일한 방법은 시도하고 보는 것입니다. 그러나 영구 테이블을 사용하면 관련 쿼리 및 인덱스를 완벽하게 제어 할 수 있습니다. 나는 연결된 서버와 OPENQUERY가 예측할 수없고 전혀 투명하지 않다는 것을 항상 발견했습니다. – Pondlife