예약 된 작업에서 다음 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 데이터 세트가 클 수 있기 때문에 임시 테이블을 작성하지 않으려 고합니다.
감사합니다. 기본적으로 SQL Server에 Oracle 테이블 복사본이 필요하므로 추가 준비 테이블이 너무 많이 보인다. 위의 세 단계를 수행하여 SSIS 패키지가 TSQL 문에서 성능을 떨어 뜨 립니 까? 유일한 차이점은 (2)입니까? SSIS는 새로운 데이터가 많은 경우 데이터를 더 작은 조각으로 분할 할 수 있습니다. 또한 병합 데이터 흐름 변환은 추가 테이블을 만들지 않고도 빠르게 진행됩니까? – ca9163d9
SSIS에서 병합 변환을 사용하지 않습니다. 필자는 오라클의 데이터를 영구 테이블에 복사하고 SQL 실행 태스크를 사용하여 이미 수행 한 것처럼 TSQL 병합을 수행합니다. 성능 질문에 대답하는 유일한 방법은 시도하고 보는 것입니다. 그러나 영구 테이블을 사용하면 관련 쿼리 및 인덱스를 완벽하게 제어 할 수 있습니다. 나는 연결된 서버와 OPENQUERY가 예측할 수없고 전혀 투명하지 않다는 것을 항상 발견했습니다. – Pondlife