programing

테이블 값 함수(TVF)와보다

telecom 2023. 4. 20. 20:01
반응형

테이블 값 함수(TVF)와보다

테이블 값 함수와 뷰의 차이점은 무엇입니까?1로 할 수 있는 것 중 어렵거나 불가능한 것이 있습니까?아니면 효율성에 차이가 있습니까?

파라미터가 없는 인라인 TVF와 실현되지 않은 뷰는 매우 유사합니다.다음은 기능상의 차이점 몇 가지입니다.

표시

Accepts Parameters               - No
Expanded out by Optimiser        - Yes
Can be Materialized in advance   - Yes (through indexed views)
Is Updatable                     - Yes 
Can contain Multiple Statements  - No
Can have triggers                - Yes
Can use side-effecting operator  - Yes  

인라인 TVF

Accepts Parameters               - Yes
Expanded out by Optimiser        - Yes
Can be Materialized in advance   - No
Is Updatable                     - Yes
Can contain Multiple Statements  - No
Can have triggers                - No
Can use side-effecting operator  - No    

멀티스테이트먼트 TVF

Accepts Parameters               - Yes
Expanded out by Optimiser        - No
Can be Materialized in advance   - No
Is Updatable                     - No
Can contain Multiple Statements  - Yes
Can have triggers                - No
Can use side-effecting operator  - No    

실행 시 뷰와 인라인 TVF는 모두 인라인화되어 파생 테이블 또는 CTE와 동일하게 취급됩니다.전체(또는 경우에 따라서는 전혀) 평가되지 않거나 여러 평가될 수 있습니다.다중 스테이트먼트 TVF는 항상 평가되고 반환 테이블 유형(기본적으로 테이블 변수)에 저장됩니다.

경우에 따라서는 인라인 TVF를 직접 파라미터화하는 기능을 통해 뷰에 대한 동등한 파라미터화된 쿼리보다 더 나은 실행 계획이 수립될 수 있습니다.

저는 일반적으로 자신의 변환 여부를 결정할 때 경험적인 규칙을 가지고 있습니다.SELECT에 대해서VIEW또는TVF.

보기를 완료하는 데 2초 이상 걸리고 10,000개 이상의 기록이 있습니까?[YES]의 경우 TVF로 변환합니다.그렇지 않으면 그냥 두세요.

물론 그 규칙은 순전히 성과에 기초한다.

TVF를 사용하면,CROSS APPLY예를 들어 프라이머리 키와 같은 특정 값을 전달한다.

WHERE ID = xxx여기서 'xxx'는 SELECT에서 전달되는 값입니다.

성능이 훨씬 더 빠릅니다!

TVF를 볼 수 있다면 SELECT에 있는 행의 1% 미만을 반환하기 위해 200만 행 이상을 반환할 수 있도록 해야 합니다.

생각해 볼 게 있어요.

함수의 반환 테이블에 PK가 지정되어 있는 경우, MultiStatement TVF와의 결합이 Views보다 훨씬 더 잘 수행된다는 것을 알게 되었습니다.

CREATE FUNCTION [FORMREQS].[fnGetFormsStatus] ()
RETURNS

/* Create a PK using two of the columns */
@Indexed TABLE (
    [OrgID] [char](8) NOT NULL,
    [PkgID] [int] NOT NULL,
    [FormID] varchar(5) NOT NULL,
    PRIMARY KEY CLUSTERED(OrgID, PkgID) 
)
AS
BEGIN
INSERT @Indexed SELECT OrgID, PkgID, FormID FROM FormsTable

RETURN

END

언급URL : https://stackoverflow.com/questions/4960137/table-valued-functiontvf-vs-view

반응형