태그 보관물: sql-server

sql-server

TVF (Table-Valued Function) vs.보기 반환 함수와 뷰의 차이점은 무엇입니까? 1로 할

테이블 반환 함수와 뷰의 차이점은 무엇입니까? 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

MultiStatement 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를 직접 매개 변수화하는 기능은 뷰에 대해 동등한 매개 변수화 된 쿼리보다 더 나은 실행 계획으로 이어질 수 있습니다.


답변

일반적으로 my 를 a 또는 a 로 변환할지 여부를 결정할 때 경험 법칙이 있습니다.SELECTVIEWTVF

보기를 완료하는 데 2 ​​초 이상 걸리고 10,000 개 이상의 레코드가 있습니까? 그렇다면 TVF로 전환하십시오. 그렇지 않다면 그대로 두십시오.

물론 규칙은 순전히 성능을 기반으로 합니다 .

CROSS APPLY예를 들어 TVF를 사용하면를 사용하여 테이블로 처리하지만 기본 키 와 같은 특정 값을 전달할 수 있습니다.

WHERE ID = xxx, 여기서 ‘xxx’는 SELECT에서 전달하는 값입니다.

성능이 훨씬 빠릅니다!

TVF에 대한 뷰가있는 경우 SELECT에서 1 % 미만을 반환하기 위해 뷰가 2 백만 개 이상의 행을 다시 가져 오도록 허용해야합니다.

생각할 것.


답변

함수의 반환 테이블에 PK가 지정되어있을 때 MultiStatement TVF와의 조인이 뷰보다 훨씬 더 나은 성능을 발휘한다는 사실을 발견했습니다.

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


답변