2016-06-09 2 views
1

그래서 최종 사용자 응용 프로그램으로 돌아 가야합니다.서버 간의 SQL 임시 테이블 연결

3 개의 매개 변수 DateType, StartDate, EndDate를 허용해야합니다.

날짜 유형은 데이터를 필터링하는 데 사용하는 날짜 필드를 결정합니다.

내가이 작업을 완료 한 방법은 데이터 형식에 대한 레코드의 모든 ID를 TEMP 테이블에 넣은 다음 내 요약을 ID 목록에 추가하는 것이 었습니다.

데이터를 저장하는 SQL 서버에서 쿼리를 실행하면 정상적으로 작동합니다.

그러나 복제 된 서버이므로 나머지 응용 프로그램 데이터가있는 서버에 저장된 저장 프로 시저로 컴파일 할 때 쿼리 속도가 느려집니다. IE 2 초 대 50 초.

SQL 서버에서 생성 된 임시 테이블에서 교차 조인을 시도한 다음 replciation 서버의 테이블에 조인하면 속도가 느려집니다.

이 문제를 해결하고이 모든 것을 하나의 저장 프로 시저에서 빌드하는 데 사용할 수있는 방법이나 기술이 있습니까?

날짜 범위가 3 인 저장 프로 시저를 만들면 다시 빠릅니다. 그러나 이것은 같은 것을 위해 여러 저장된 procs를 유지하는 것을 의미합니다.

답변

0

먼저 2012 SP1보다 오래된 SQL Server 버전을 실행하는 경우 DBCC SHOW_STATISTICS (시스템 관리자가 아닌 대부분의 사용자 인 경우)을 실행할 수없는 사용자는 "사용 권한" 섹션 참조)은 원격 테이블의 통계에 액세스하지 못합니다. 이는 최적화 프로그램이 좋은 실행 계획을 생성 할 수있는 능력을 심각하게 손상시킬 수 있습니다. SQL Server를 업그레이드하거나 더 많은 사용 권한을 부여하면 도움이됩니다.

쿼리에 필터링 또는 문자 열에 대한 조인이 필요한 경우 원격 서버에 연결된 서버 옵션에서 "데이터 정렬 호환"으로 플래그가 지정되어 있는지 확인하십시오. 이 옵션이 해제되어 있으면 SQL Server는 문자열을 서버에서 비교할 수 있다고 가정 할 수 없으며 전체 테이블을 위아래로 펌핑하기 시작하여 데이터가 비교 대상이 될 수 있도록합니다.

실행 계획이 만족스럽고 여전히 충분하지 않은 경우 일반적인 (절름발이) 기술은 모든 데이터를 로컬로 먼저 전송 한 다음 비 분산 쿼리로 쿼리를 실행하는 것입니다. 분명히이 작업을 위해서는 원격 테이블을 "너무 커"수 없으며 어떤 경우에는 실제로 얼마나 많은 행이 포함되는지에 따라 성능이 저하됩니다. 그러나 최적화 프로그램이 로컬 테이블을 사용하면 더 나은 작업을 수행 할 수 있으므로 항상 고려해 볼 가치가 있습니다.

서버간에 테이블을 끌어 당기는 것을 피하는 또 다른 방법은 원격 저장 프로 시저 호출에 대한 매개 변수로 데이터를 채우는 것입니다. XML 열이나 테이블 반환 매개 변수가 분산 쿼리에서 지원되지 않으므로 XML에서 NVARCHAR(MAX)까지 전체 테이블을 전달할 수 있습니다. 기본 개념은 동일합니다. 최적화 프로그램이 효율적인 분산 쿼리를 찾아 낼 필요가 없습니다. 최선의 접근 방식은 데이터와 쿼리에 따라 크게 달라집니다.