2012-05-14 3 views
1

내 응용 프로그램에 다른 뷰와 테이블이있는 INNER JOIN이있는 뷰가 있습니다.SQL Server의 IN 절에 저장 프로 시저 출력을 사용하는 방법

view ViewName 
select * from AnotherView inner join TableName ON conditions 

이보기는 INNER JOIN 문과 함께 실행하는 데 너무 많은 시간이 걸립니다. 그래서 SP를 사용하여 성능을 향상 시키려고합니다. 나는 실제 테이블에서 INNER JOIN을 제거하려고합니다.

내 SP는 추가 절에 필요한 데이터를 가져옵니다.

그래서 코드는
view ViewName 
select * from AnotherView where columnName in (result of SP) 

는 내가보기에서보기를 호출, 테이블 변수를했는데, 다음과 같이 표시됩니다. 그러나 실행 시간은 매번 약간의 차이점과 동일하게 보인다.

아무도 이해할 수 있습니까? 가능할 수 있습니까? 이것을 달성하는 다른 더 좋은 방법이 있습니까? 나는 openrowset을 사용하고 싶지 않습니다. 사전에

감사합니다,
비제이

+0

는 소리 - 당신이 원하는 경우 결과 세트를 사용합니다. –

+5

저장 프로 시저가 성능을 향상시킬 것이라고 생각하는 이유는 무엇입니까? - 쿼리가 현재 성능이 좋지 않은 경우 인덱스를 검사해야합니다. 옵티마이 저가 * less *로 수행 할 수있는 새롭고 불투명 한 코드를 도입하지 않아야합니다. –

+0

문제의 원인을 확인 했습니까? 조인은 쿼리를 느리게 만들지 만 실제로 관심을 가져야합니까? 'AnotherView'는 어떻게 생겼습니까? –

답변

0

는 임시 테이블에 결과를 놓고 내부가 함께 참여합니다.

또는

변수 (또는 출력 변수)에 결과를 넣어 사용하는 동적 SQL을 사용한다.


성능을 향상 시키려면 조건에 사용 된 열의 인덱스를 사용하십시오.

+0

예 해봤습니다.그러나 실행 시간이 길을 가야하는 것 같은 :( –

+0

인덱스입니다 –

+0

나는 데이터베이스에 대한 약간의 지식을 가지고 당신은 단지 이들 중 하나를 수행해야 –

2

보기에 다음 쿼리를 배치하면 sp 결과와 함께 내부 조인이 만들어집니다.

보기에서 OpenRowSet을 사용하여 sp에 액세스 할 수 있습니다.

SELECT * 
FROM AnotherView 
     INNER JOIN (SELECT a.* 
        FROM OPENROWSET('SQLNCLI', 
            'Server=(local);TRUSTED_CONNECTION=YES;', 
            'EXEC database.dbo.Spname') AS a) AS b 
     ON AnotherView.columnName = b.columnname 

자격 증명이 개발자가 제어 할 수없는 경우 연결된 서버를 만들고 openrowset에 서버 이름을 전달할 수 있습니다. 자격 증명을 전달할 필요가 없습니다. 데이터베이스에 링크 서버를 만드는 방법

:

EXEC master.dbo.sp_addlinkedserver 
@server = N'LinkServerName', 
@srvproduct=N'MSSQL', 
@provider=N'SQLNCLI', 
@provstr=N'PROVIDER=SQLOLEDB;SERVER=.\SQLEXPRESS;Database=DbName' 

EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'LinkServerName', 
@useself=N'True', 
@locallogin=NULL 
보기에서 SP를 실행하는 방법

: 당신이 테이블 반환 함수가 아닌 저장 프로 시저를 원하는처럼

SELECT * From OPENQUERY([LinkServerName],DbName.dbo.spname) 
+0

나는 OPENROWSET을 사용할 수 없습니다 그것은으로 변경하는 일반 데이터베이스입니다. 이 설정은 개발자가 제어하지 않습니다. –

관련 문제