뷰에서 OPENQUERY 사용의 성능 영향


15

stackoverflow 에서이 질문 을 참조하십시오 :

EasySoft ODBC 드라이버를 사용하여 SQL Server 2008 R2 Express 인스턴스를 Interbase에 연결하고 있으며 원격 서버에서 메타 데이터를 가져 오는 데 어려움이 있습니다. 인터넷에서 살펴보면 주요 sugestions는 네 부분으로 연결된 서버 구문 대신 OPENQUERY를 사용한다고 언급합니다.

EG 내 현재 (문제점) 접근법은 ...

CREATE VIEW [LIVE].[vwPRDETS]
AS

SELECT *
FROM [LBLIVE]...[PRDETS] WITH (NOLOCK)

그러나 일부 테이블에서는 뷰를 호출 할 때 오류가 발생합니다 ...

메시지 7353, 수준 16, 상태 1, 줄 1 연결된 서버 "LBLIVE"의 OLE DB 공급자 "MSDASQL"이 일치하지 않는 메타 데이터를 제공했습니다. 실행 중에 컴파일 타임에 찾을 수없는 추가 열이 제공되었습니다.

또한 다음과 같은 이유로 인해 일부 뷰를 만들 수도 없습니다 ...

메시지 7315, 수준 16, 상태 1, 줄 1 연결된 서버 "LBLIVE"의 OLE DB 공급자 "MSDASQL"에는 ""SYSDBA "."AUDIT_LBABKP ""이름과 일치하는 여러 테이블이 포함되어 있습니다.

언급 된 표 중 하나만 있지만.

인터넷 검색의 대안은 더 비슷해 보입니다.

SELECT *
FROM OPENQUERY(<linked sevrer>, 'SELECT <column list> FROM MyTable')

그래서 내 질문은 뷰 정의에서 OPENQUERY를 사용하면 SQL Server가 Interbase로 전송되는 결과 SQL을 최적화 할 수 있습니까? 아니면 두 방법 사이에 큰 차이가 없습니까?

그것은 교차 주제이며 dba의 POV를 좋아할 것입니다.

답변:


20

요약

연결된 서버가 가능한 한 많이하도록하십시오.
그것은이다 불가능 SQL Server가 연결된 서버에 심지어 다른 SQL 서버 쿼리를 최적화하는

핵심 요소는 어디 쿼리가 실행됩니다.

이 경우에는 간단한 SELECT이므로 테이블의 모든 행이 와이어로 전송됩니다. 중요하지 않습니다.

JOIN과 WHERE를 추가하면 문제가 될 수 있습니다. SQL Server가 연결된 서버가 가능한 한 많은 필터링을 수행하여 네트워크를 통해 들어오는 데이터의 크기를 줄이기를 원합니다.

예를 들어, 두 번째 경우가 더 효율적입니다.

SELECT *
FROM OPENQUERY(<linked server>, 
            'SELECT <column list> FROM MyTable') T1
     JOIN
     SomeLocalTable T2 ON ...
WHERE T1.foo = 'bar'

SELECT *
FROM OPENQUERY(<linked server>, 
           'SELECT <column list> FROM MyTable WHERE foo = ''bar''')
     JOIN
     SomeLocalTable T2 ON ...

OPENQUERY의 한계는 매개 변수를 사용할 수 없다는 것입니다. 따라서 WHERE 절 등을 추가하려면 동적 SQL이 필요합니다.

연결된 서버 성능에 영향을 줄 수 있습니다 sp_serveroption. 설정 collation compatible은 모든 것을 말한다

이 옵션을 true로 설정하면 SQL Server는 연결된 서버의 모든 문자가 문자 집합 및 데이터 정렬 순서 (또는 정렬 순서)와 관련하여 로컬 서버와 호환되는 것으로 가정합니다. 이를 통해 SQL Server는 문자 열에 대한 비교를 공급자에게 보낼 수 있습니다. 이 옵션을 설정하지 않으면 SQL Server는 항상 문자 열에 대한 비교를 로컬로 평가합니다.

즉, SQL Server에서 데이터를 로컬로 처리하지 않도록하십시오.

참고 : foo = 'bar'위의 두 번째 예에서 필터는 SQL Server에 대한 문자열 상수이기 때문에 연결된 서버로 전송됩니다. 첫 번째 예에서 실제 WHERE 절은 원격으로 전송되거나 전송되지 않을 수 있습니다.

마지막으로 데이터를 임시 테이블에 스테이징하고 로컬 테이블에 조인하는 것이 OPENQUERY에 직접 조인하는 것보다 낫다는 것을 알았습니다.


+1 원격 서버에서 실행되는 문자열 리터럴에 대한 간단한 where 절 비교가 아닌 이유는 무엇입니까? 대답은 "콜 레이션 호환"이었습니다. 감사.
mwardm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.