TVF (Table-Valued Function) vs.보기


83

테이블 반환 함수와 뷰의 차이점은 무엇입니까? 1로 할 수있는 일 중 다른 사람으로는하기 어렵거나 불가능한 것이 있습니까? 아니면 효율성에 차이가 있습니까?

답변:


136

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


3
tvf가 무슨 뜻이야 Is Updatable?
Royi Namir

2
@RoyiNamir-인라인 TVF를 사용하여 뷰와 유사한 기본 테이블을 업데이트 할 수 있습니다.
Martin Smith

TVF가 자체적으로 returend 테이블을 업데이트 할 수 있다는 의미입니까?
Royi Namir

12
@RoyiNamir - 예CREATE TABLE T(C INT);EXEC('CREATE FUNCTION F () RETURNS TABLE AS RETURN (SELECT * FROM T)');INSERT INTO F() VALUES(1);SELECT * FROM T;
마틴 스미스

다른 차이의 부부 with check optionVIEW_METADATA
마틴 스미스

5

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

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

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

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

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

성능이 훨씬 빠릅니다!

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

생각할 것.


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

1
그리고보기도 마찬가지입니다. 실제로 테이블을 작성하면 기능이 훨씬 느려집니다. 인라인 함수, 즉 단일 RETURNS절이 있는 함수 는 임시 테이블을 만들 필요가 없으므로 적어도 두 배 빠른 속도로 실행됩니다. 아마도 훨씬 빨리, 최적화는 최적화의 쿼리를 포함 할 수있을 것 이후
파나지오티스 Kanavos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.