매개 변수가있는 테이블 값 함수 인 CROSS APPLY
에 문제가 있습니다. 다음은 단순화 의사 코드 예제 :테이블 값 함수 제한 성능을 적용한 경우
SELECT *
FROM (
SELECT lor.*
FROM LOT_OF_ROWS_TABLE lor
WHERE ...
) AS lor
CROSS APPLY dbo.HeavyTableValuedFunction(lor.ID) AS htvf
INNER JOIN ANOTHER_TABLE AS at ON lor.ID = at.ID
WHERE ...
- 내부는
LOT_OF_ROWS_TABLE
많은 행을 반환 테이블에 선택합니다. - 테이블 조인
LOT_OF_ROWS_TABLE
및ANOTHER_TABLE
은 하나 또는 몇 개의 행만 반환합니다. - 테이블 값 함수는 매우 많은 시간이 걸리고 많은 행을 호출 할 때 선택 시간이 매우 길어집니다.
내 문제 :
기능은 모든 행에 대해 호출은 ANOTHER_TABLE
에 가입하면 데이터가 제한 될 것이라는 사실에 관계없이 LOT_OF_ROWS_TABLE
에서 돌아왔다.
선택 항목은 표시된 형식이어야하며 실제로 생성되며 실제로는 훨씬 어려워집니다.
나는 그것을 다시 할 때, 그것은 매우 빠르게 할 수 있지만, 이렇게 다시 할 수 없습니다
어떤 설정이 아니면 : 내가 좋아하는 것
SELECT *
FROM (
SELECT lor.*
FROM LOT_OF_ROWS_TABLE lor
WHERE ...
) AS lor
INNER JOIN ANOTHER_TABLE AS at ON lor.ID = at.ID
CROSS APPLY dbo.HeavyTableValuedFunction(at.ID) AS htvf
WHERE ...
알고 힌트 또는 select가 마지막으로 제한된 행에 대해서만 함수를 호출하도록 강요합니다.
감사합니다.
는 편집 :
테이블 반환 함수는 매우 복잡하다 : http://pastebin.com/w6azRvxR. 우리가 말하는 선택은 "사용자 구성"이며 생성 : http://pastebin.com/bFbanY2n.
2 개 부분SELECT lor.*,at.* into #tempresult
FROM (
SELECT lor.*
FROM LOT_OF_ROWS_TABLE lor
WHERE ...
) lor
INNER JOIN ANOTHER_TABLE AS at ON lor.ID = at.ID
WHERE ...
이제 테이블 반환 함수가 걸리는 부분의 시간을 두 테이블 변수 또는 임시 테이블을 사용하여에이 쿼리를 나눌 수
명백한 어쩌면 : 쿼리 텍스트에서 조인 순서 만 변경할 수있는 경우. 그런 다음 FORCE_ORDER 쿼리 힌트를 사용할 수 있습니다. 코드가 어떻게 생성됩니까? 그 목적으로 행동을 바꿀 수있는 방법이 없습니까? –
'dbo.HeavyTableValuedFunction (..)'의 멀티 라인 테이블 반환 함수를 인라인 테이블 반환 함수로 변경하십시오. – RBarryYoung
@RBarryYoung : 너무 복잡하여 인라인 함수로 다시 작성할 수 없습니다. –