2011-01-26 2 views
15

여러 저장 프로 시저에서 재사용 할 SQL 쿼리가 있습니다. 쿼리는 여러 테이블에 대해 작동하고 전달 된 2 개의 변수를 기반으로 정수 값을 반환합니다.보기 또는 함수와 함께 SQL을 다시 사용하십시오.

오히려 다른 저장 프로 시저에서 쿼리를 반복하는 것보다 나는 그것을 공유 할 2 가지 옵션이 있습니다 :

  1. 내가 변수에 따라에 가입하고 그것에서 정수 값을 얻을 수있는 뷰를 작성합니다.
  2. 가 전달 기준을 다시 함수를 만들고 반환 정수 내가 옵션 1쪽으로 생각이 기울고 있어요하지만 더 일반적이다하는 의견을 싶습니다

변수입니다. RDBMS에는 SQL 서버

답변

13

에 적용하려면 중 하나를 필요 결과를 필터링하는 데 항상 동일한 매개 변수가있는 술어를 사용하는 경우 매개 변수화 된 인라인 테이블 값 함수를 사용해야합니다. 이론적으로 이것은 뷰와 동일하게 취급됩니다. 둘 다 실제로 옵티 마이저에 의해 확장되므로 술어 푸시 문제를 피할 수 있습니다. 이러한 경우의 예는 this article의 두 번째 부분에서 볼 수 있습니다.

Andomar는 대부분의 경우 쿼리 최적화 프로그램이 필요한 부분까지 조건부를 푸시하는 작업을 잘 수행하지만 인라인 TVF를 사용하면 어떤 상황이 발생하는지 잘 알지 못합니다 최악의 경우 두 가지 (매우 유사한) 구문 사이에서 합리적으로 기본 선택을하는 것처럼 보입니다.

내가보기에 볼 수있는 장점 중 하나는 필터없이 또는 다른 필터로 선택할 수 있으므로 더 다양한 기능을 사용할 수 있다는 것입니다.

효율성 향상을 위해 스칼라 UDF를 대체하기 위해 인라인 TVF를 사용하여 as in this example을 사용할 수도 있습니다.

1

당신은보기에 변수를 전달할 수 없습니다, 그것은 보인다 그래서 유일한 옵션은을 사용하는 것입니다 어느 것이 더 나은 성능 등 현명한

편집은 (기능 뷰에 가입 또는 전화)을 것 기능. 두 가지 옵션이 거기에 있습니다 : 당신이 기록을 반환 한 경우

  • 스칼라 기능
  • 테이블 반환 함수 (인라인 또는 다중 문)

, 당신은 WHERE 절을 사용할 수 있습니다 보기에서 쿼리에 줄 지어 나타날 수있는 너무 복잡하지 않은 VIEW 외부에서 하나의 열 integer value이 반환되므로 모두보기가 작동하지 않습니다.

인라인 TVF는 외부 (호출) 쿼리와 함께 작동하도록 쿼리 최적화 프로그램에 의해 확장 될 수 있으므로 SCALAR 기능과 비교할 때 대부분의 경우 더 빠를 수 있습니다.

그러나, 용도가 다르다 - 스칼라 함수는 인라인 TVF 반면 단일 값을 즉시

select dbo.scalarme(col1, col2), other from .. 

를 반환하면이 하위 쿼리 또는 CROSS 다른 테이블

select (select value from dbo.tvf(col1, col2)), other from .. 

-- or 

select f.value, t.other 
from tbl t 
CROSS apply dbo.tvf(col1, col2) f -- or outer apply 
+0

뷰는 단일 열의 단일 행 결과를 반환 할 수 있습니다. 틀림없이 일반적인 경우는 아니지만 여전히 스칼라 UDF보다 효율적입니다. 편집 - 아, 당신은 매개 변수화 측면에 의문을 제기하고있었습니다. 저는 이것이 그 관점에 대한 술어를 통해 이루어질 것이라고 생각했습니다. –

+0

뷰에 가입하고 where 절을 기반으로 결과를 제한 할 수 있습니다. – amateur

+0

일반적으로 Where 절이있는 뷰에 매개 변수를 "전달"합니다. – Andomar

0

성능면에서 무엇이 더 좋은지 확신 할 수 없기 때문에 반감을 제공 할 것입니다. 유감입니다. 그러나 다른 사람들은 분명히 그 점수에 대해 좋은 조언을 얻었습니다. 나는 확신합니다.

저는 귀하의 '관행'부분에 충실합니다.

그래서 스칼라 함수 우드가이 경우 자연스러운 해결책 인 것 같습니다. 왜, 당신은 단지 정수 값이 반환되기를 원한다. 이것은 스칼라 함수가 사용하는 것이다.

하지만 나중에 하나 이상의 값이 필요할 확률을 볼 수 있다면 TVF로 전환하는 것이 좋습니다. 그런 다음 다시 스칼라 함수를 구현하여 응용 프로그램의 여러 곳에서 사용하고 기본적으로 동일한 논리를 사용하여 행, 열 또는 값 테이블을 반환해야하는 경우 어떻게해야할까요?

내 견해 (말장난 의도 없음)에서보기는 스칼라 및 테이블 반환 함수에 대한 가장 큰 공통 제수와 같을 수 있습니다. 함수는 매개 변수를 적용하기 만하면됩니다.

이제 어떤 옵션을 사용할 것인지 선택할 계획이라고 말했습니다. 그러나 위의 내용을 고려할 때 뷰는 좋은 선택이 될 수 있으며 응용 프로그램을 확장 할 때 유용하다고 생각하며 뷰와 함수를 모두 사용할 수 있습니다 (성능이 너무 나쁘지 않은 경우). 설명했다.

0

TVF가보기에 대해 갖는 한 가지 장점은 누군가를 호출하여 특정 색인을 대상으로하도록 강요 할 수 있다는 것입니다.

관련 문제