0

이것은 내 문제입니다. 연결된 서버를 정의한 후 LINKSERV이라고하며 LINKDB이라는 데이터베이스가 있습니다. 내 서버 (MYSERV)에는 MYDB 데이터베이스가 있습니다.연결된 서버가있는 단일 SELECT는 ID 별 다중 SELECT를 만듭니다

아래 질문을 수행하고 싶습니다.

SELECT * 
FROM LINKSERV.LINKDB.LINKSCHEMA.LINKTABLE 
    INNER JOIN MYSERV.MYDB.MYSCHEMA.MYTABLE ON MYKEYFIELD = LINKKEYFIELD 

문제는 그 프로파일에 대해 살펴 경우, 내가 SELECT의 LINKSERV 서버를 많이에서 만들어진 것을 볼 수 있다는 것입니다. @1 모든이 변경되는 매개 변수입니다

SELECT * 
FROM LINKTABLE WHERE LINKKEYFIELD = @1 

선택 : 그들은 비슷합니다. 물론 이것은 성능이 좋지 않기 때문에 원치 않는 것입니다. 내가 틀릴 수도 있지만 문제는 JOIN에서 다른 서버를 사용하는 것과 관련이 있다고 가정합니다. 사실, 이것을 피하면 문제가 사라집니다.

맞습니까? 해결책이 있습니까? 미리 감사드립니다.

+0

이것은 매개 변수화 된 쿼리라고하며 매우 잘 수행되어야합니다. 이 용어에 대한 검색을 수행하십시오. LINKTABLE.LINKKEYFIELD에 인덱스를 추가해야합니다. – Hogan

+0

이것은 매개 변수가있는 쿼리와 관련이 없습니다. 연결된 서버의 쿼리는 다르게 동작하도록 바인딩됩니다. BTW, 어떤 버전의 SQL Server에 대해 이야기하고 있습니까? –

+0

** MYSERV **는 SQL2008R2이고 ** LINKSERV **는 SQL2008입니다. – ufo

답변

1

원격 서버에서 반환되는 행 수를 제한하는 데 사용할 수있는 필터 문이 없기 때문에 가장 적합한 솔루션 일 수 있습니다.

두 개 이상의 서버에서 데이터를 가져 오는 쿼리를 실행하면 쿼리 최적화 프로그램이 수행 할 작업을 결정해야합니다. 많은 데이터를 요청한 서버로 가져 와서 거기에 조인하거나 쿼리의 일부를 보내야합니다 평가를 위해 연결된 서버에? 필터와 두 서버의 통계 가용성 또는 품질에 따라 옵티마이 저는 조인 (병합 또는 중첩 루프)에 대해 다른 작업을 선택할 수 있습니다.

경우에 따라 로컬 테이블에 대상보다 적은 행이 있고 각 로컬 행에 해당하는 대상 행을 요청했습니다.

이 동작 및 성능을 향상시킬 수있는 방법은 명백한 최적화 통계를 업데이트하고 행이 원격 테이블에서 반환 된 필터링하는 WHERE 문을 추가 Linked Server behavior when used on JOIN clauses

에 설명되어 있습니다. 또 다른 최적화는 원격 서버에서 필요한 열만을 반환하는 것입니다. *

+0

답장을 보내 주셔서 감사합니다. 물론, 여러분이 제안한 최적화는 이미 실제 시나리오에서 구현되었습니다. 조인에 사용되는 필드에 대한 인덱스도 있습니다. 성능은 여전히 ​​우리에게 좋지 않습니다. 가장 강력한 가져 오기 논리를 도입해야합니다. 또 다른 질문으로,'OPENROWSET'이 연결된 서버의 좋은 대안이 될 수 있다고 생각합니까 아니면이 시나리오가 더 좋을까요? 고맙습니다. – ufo