Halloween Protection 이외의 기능을 SCHEMABINDING하면 어떤 이점이 있습니까?


52

SCHEMABINDING함수가 업데이트 계획에서 불필요한 스풀 을 피할 수 있다는 것은 잘 알려져 있습니다 .

테이블을 건드리지 않는 (즉, 데이터에 액세스하지 않는) 간단한 T-SQL UDF를 사용하는 SCHEMABINDING경우 UDF 작성 중에 옵션 을 지정하십시오 . 그러면 UDF가 스키마에 바인드되고 쿼리 최적화 프로그램이 이러한 UDF와 관련된 쿼리 계획에 대해 불필요한 스풀 연산자를 생성하지 않도록합니다.

SCHEMABINDING데이터에 액세스하지 않더라도 함수 의 다른 장점이 있습니까?

답변:


78

예.

지정하지 않으면 WITH SCHEMABINDINGSQL Server는 일반적으로 함수 본문에서 수행하는 세부 검사를 건너 뜁니다. 그것은 단순히 함수가 데이터에 액세스하는 것으로 표시합니다 (질문에 주어진 링크에서 언급했듯이).

이것은 성능 최적화입니다. 이 가정을하지 않으면 SQL Server는 바인딩되지 않은 함수가 언제든지 변경 될 수 있으므로 모든 함수 호출에 대한 자세한 검사를 수행해야합니다.

있다 다섯 개 중요한 기능 특성 :

  • 결정론
  • 정도
  • 데이터 접근
  • 시스템 데이터 액세스
  • 시스템 검증

예를 들어, 다음 언 바운드 스칼라 함수를 사용하십시오.

CREATE FUNCTION dbo.F
(
    @i integer
)
RETURNS datetime
AS
BEGIN
    RETURN '19000101';
END;

메타 데이터 함수를 사용하여 5 가지 속성을 볼 수 있습니다.

SELECT 
    IsDeterministic = OBJECTPROPERTYEX(Func.ID, 'IsDeterministic'),
    IsPrecise = OBJECTPROPERTYEX(Func.ID, 'IsPrecise'),
    IsSystemVerified = OBJECTPROPERTYEX(Func.ID, 'IsSystemVerified'),
    UserDataAccess = OBJECTPROPERTYEX(Func.ID, 'UserDataAccess'),
    SystemDataAccess = OBJECTPROPERTYEX(Func.ID, 'SystemDataAccess')
FROM (VALUES(OBJECT_ID(N'dbo.F', N'FN'))) AS Func (ID);

결과

두 개의 데이터 액세스 특성이 true로 설정되었고 다른 세 가지 특성이 false로 설정되었습니다 .

예를 들어 인덱싱 된 뷰나 인덱싱 된 계산 열에서 사용하는 것 이상의 의미가 있습니다.

쿼리 최적화 프로그램에 미치는 영향

결정론의 특정의 속성은 쿼리 최적화에 영향을 미칩니다. 재 작성 및 조작 유형에 관한 자세한 규칙이 있으며 결정적이지 않은 요소에 대해서는 매우 제한적 입니다. 부작용은 매우 미묘 할 수 있습니다.

예를 들어 다음 두 테이블을 고려하십시오.

CREATE TABLE dbo.T1
(
    SomeInteger integer PRIMARY KEY
);
GO
CREATE TABLE dbo.T2
(
    SomeDate datetime PRIMARY KEY
);

... 그리고 함수를 사용하는 쿼리 (이전에 정의 된대로) :

SELECT * 
FROM dbo.T1 AS T1
JOIN dbo.T2 AS T2
    ON T2.SomeDate = dbo.F(T1.SomeInteger);

쿼리 계획은 예상대로 테이블 T2에 대한 탐색을 특징으로합니다.

계획을 추구

그러나 파생 테이블 또는 공통 테이블 표현식을 사용하여 동일한 논리적 쿼리를 작성하는 경우 :

WITH CTE AS
(
    SELECT *, dt = dbo.F(T1.SomeInteger) 
    FROM dbo.T1 AS T1
)
SELECT * 
FROM CTE
JOIN dbo.T2 AS T2
    ON T2.SomeDate = CTE.dt;

-- Derived table
SELECT
    *
FROM 
(
    SELECT *, dt = dbo.F(T1.SomeInteger)
    FROM dbo.T1 AS T1
) AS T1
JOIN dbo.T2 AS T2
    ON T2.SomeDate = T1.dt;

실행 계획은 이제 스캔에 기능이 있으며, 함수에 관련된 술어가 필터에 붙어 있습니다.

스캔 계획

파생 테이블 또는 공통 테이블 표현식이 뷰 또는 인라인 함수로 대체되는 경우에도 발생합니다. FORCESEEK힌트 (및 기타 유사한 시도가) 실패합니다 :

에러 메시지

근본적인 문제는 쿼리 최적화 프로그램 이 비 결정적 쿼리 요소를 자유롭게 재정렬 할 수 없다는 것 입니다.

탐색을 생성하려면 필터 조건자를 계획 아래로 T2 데이터 액세스로 이동해야합니다. 이 결정은 기능이 비 결정적 일 때 방지됩니다.

고치다

이 예제의 수정에는 두 단계가 포함됩니다.

  1. 더하다 WITH SCHEMABINDING
  2. 함수를 결정 론적으로 만드십시오

첫 번째 단계는 간단합니다. 두 번째는 문자열에서 비 결정적 암시 적 캐스트를 제거하는 단계입니다 datetime. 결정 론적으로 대체 CONVERT. 그 자체로는 충분하지 않습니다 .

ALTER FUNCTION dbo.F
(
    @i integer
)
RETURNS datetime
WITH SCHEMABINDING
AS
BEGIN
    -- Convert with a deterministic style
    RETURN CONVERT(datetime, '19000101', 112);
END;

기능 속성은 다음과 같습니다.

새로운 속성

옵티마이 저가 해제되면 모든 예제는 이제 원하는 탐색 계획을 생성합니다 .


해당 구문에서 변환 스타일을 지정할 수 없으므로 함수에서 CASTto 를 사용하면 datetime작동하지 않습니다.

ALTER FUNCTION dbo.F
(
    @i integer
)
RETURNS datetime
WITH SCHEMABINDING
AS
BEGIN
    -- Convert with a deterministic style
    RETURN CAST('19000101' AS datetime);
END;

이 함수 정의는 스캔 계획을 생성하며 특성에 따라 결정적이지 않은 것으로 표시됩니다.

CAST 함수 속성

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.