테이블 반환 함수와 뷰의 차이점은 무엇입니까? 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
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
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를 직접 매개 변수화하는 기능은 뷰에 대해 동등한 매개 변수화 된 쿼리보다 더 나은 실행 계획으로 이어질 수 있습니다.
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 option
와VIEW_METADATA
일반적으로 my 를 a 또는 a 로 변환할지 여부를 결정할 때 경험 법칙이 있습니다.SELECT
VIEW
TVF
보기를 완료하는 데 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
RETURNS
절이 있는 함수 는 임시 테이블을 만들 필요가 없으므로 적어도 두 배 빠른 속도로 실행됩니다. 아마도 훨씬 빨리, 최적화는 최적화의 쿼리를 포함 할 수있을 것 이후
Is Updatable
?