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.