11

(A SQL 서버 2008 R2), I는 동의어가 연결된 서버를 가리키는 syn_view1라는이는 remoteserver.remotedb.dbo.view1성능 효과는 localserver에

이 SLOW 쿼리를 실행 20초에게 소요 .

select e.column1, e.column2 
from syn_view1 e 
where e.column3 = 'xxx' 
    and e.column4 = 'yyy' 
order by e.column1 

이 FAST 쿼리를 실행 일초 걸립니다.

select e.column1, e.column2 
from remoteserver.remotedb.dbo.view1 e 
where e.column3 = 'xxx' 
    and e.column4 = 'yyy' 
order by e.column1 

두 쿼리의 유일한 차이점은 실제로 동의어입니다. 분명히 동의어는 쿼리 성능에 영향을 미칩니다.

슬로우 쿼리에 대한 실행 계획은 다음과 같습니다

Plan    Cost % Subtree cost 
4 SELECT 
I/O cost: 0.000000 CPU cost: 0.000000 Executes: 0 
Cost: 0.000000     0.00 3.3521 
    3 Filter 
    I/O cost: 0.000000 CPU cost: 0.008800 Executes: 1 
    Cost: 0.008800    0.26 3.3521 
     2 Compute Scalar 
     I/O cost: 0.000000 CPU cost: 3.343333 Executes: 1 
     Cost: 0.000000   0.00 3.3433 
      1 Remote Query 
      I/O cost: 0.000000 CPU cost: 3.343333 Executes: 1 
      Cost: 3.343333  99.74 3.3433 

그리고 FAST 쿼리 :

Plan   Cost % Subtree cost 
3 SELECT 
I/O cost: 0.000000 CPU cost: 0.000000 Executes: 0 
Cost: 0.000000    0.00 0.1974 
    2 Compute Scalar 
    I/O cost: 0.000000 CPU cost: 0.197447 Executes: 1 
    Cost: 0.000000   0.00 0.1974 
     1 Remote Query 
     I/O cost: 0.000000 CPU cost: 0.197447 Executes: 1 
     Cost: 0.197447  100.00 0.1974 

나의 이해는 SLOW 쿼리에서, 서버는 모든 데이터를 가져 오는 것입니다 원격 서버는 FAST 쿼리에서 서버가 필터링 된 데이터를 원격 서버에서 가져와 원격 인덱스를 사용하는 반면 인덱스는 없지만 필터를 적용합니다.

빠른 속도로 동의어를 사용할 수 있습니까? 아마도 연결된 서버의 설정입니까? 로컬 데이터베이스 서버?

도움 주셔서 감사합니다.

+0

원격 서버에서 프로 시저를 만들 것을 제안하십시오. –

+0

@AaronBertrand, 무엇이 바뀌겠습니까? 인덱스를 사용합니까?내 저장 프로 시저 내에서 연결된 서버의 전체 정규화 된 이름을 지정하지 않아도됩니까? –

+0

예와 예. 그리고 뷰 대신 스토어드 프로 시저 이름의 동의어를 작성할 수 있습니다. –

답변

1

dba.stacexchange.com의 this post에 대한 대답은 연결된 서버에 대한 제한된 액세스 권한으로 인해 연결된 서버를 통한 쿼리에서 성능이 떨어질 수 있으며 로컬 서버에 대한 테이블 통계의 가시성을 제한합니다. 이는 쿼리 계획 및 성능에 영향을 미칠 수 있습니다.

발췌 :

는 그리고 이것은 내가 다른 결과를 얻었다 이유입니다. sysadmin으로 실행할 때 I 은 주문 ID가> 20000 인 행이없고 예상 값이 한 행 이었음을 나타내는 전체 분포 통계를 얻었습니다. ( 은 옵티마이 저가 통계에서 0 행을 취하지 않는다는 것을 상기하십시오.) 일반 사용자로 실행하면 DBCC SHOW_STATISTICS가 권한 오류로 실패했습니다. 이 오류는 전파되지 않았지만 대신 옵티마이 저가 통계가없고 기본값 인 가정을 허용했습니다. 카디널리티 정보를 얻었으므로 원격 테이블에 830 개의 행이 있고 249 개의 행이 추정됩니다. 내가 로컬 서버에서 임시 테이블에하여 데이터 순서없이 덤프 것

+0

연결된 서버에 대한 쿼리의 성능이 여러 가지 문제로 인해 어려움을 겪을 수 있지만 그 이유는 동의어 쿼리와 연결된 테이블 간의 차이점입니다. 동의어 자체에 다른 액세스 권한이 설정되어 있다고 제안하지 않는 한 궁극적으로 동의어는 동일한 연결을 제공합니까? – PhillipH

+1

@PhillipH : 분명히 * 동의어에 대해 * 어떤 것이 다릅니다. 이 설명은 관찰 된 성능 저하를 야기하기에 충분하므로 원격 서버를 확인할 가치가 있습니다. –

2

. 그런 다음에 임시 테이블에서 순서를 선택합니다. 주문은 거의 항상 살인자입니다.