다음을 통해 공유


계산 열의 인덱스

적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance

다음 요구 사항이 충족되는 한 계산 열에서 인덱스를 정의할 수 있습니다.

  • 소유권 요구 사항
  • 요구 사항 결정
  • 정밀도 요구 사항
  • 데이터 형식 요구 사항
  • SET 옵션 요구 사항

참고 항목

계산 열이나 인덱싱된 뷰에서 인덱스를 만들거나 변경하는 경우 SET QUOTED_IDENTIFIERON으로 설정해야 합니다. 자세한 내용은 SET QUOTED_IDENTIFIER(Transact-SQL)를 참조하세요.

소유권 요구 사항

계산 열에서 모든 함수 참조의 소유자는 테이블 소유자와 같아야 합니다.

요구 사항 결정

지정된 입력 집합에 대해 항상 같은 결과 집합을 반환하는 식은 결정적입니다. COLUMNPROPERTY 함수의 IsDeterministic 속성은 computed_column_expression이 결정적인지를 보고합니다.

computed_column_expression은 결정적이어야 합니다. computed_column_expression은 다음과 같은 모든 조건이 충족되는 경우 결정적입니다.

  • 식에서 참조하는 모든 함수는 결정적이고 정확합니다. 이러한 함수에는 사용자 정의 함수와 기본 제공 함수가 모두 포함됩니다. 자세한 내용은 Deterministic and Nondeterministic Functions을 참조하세요. 계산 열이 PERSISTED인 경우 함수가 정확하지 않을 수 있습니다. 자세한 내용은 이 문서 뒷부분에 나오는 지속형 계산 열에 대한 인덱스 만들기를 참조하세요.

  • 식에서 참조되는 모든 열은 계산 열이 포함된 테이블에서 가져옵니다.

  • 열 참조는 여러 행에서 데이터를 끌어오지 않습니다. 예를 들어 SUM 또는 AVG와 같은 집계 함수는 여러 행의 데이터에 의존하며 이는 computed_column_expression을 비결정적으로 만듭니다.

  • computed_column_expression은 시스템 데이터 액세스 또는 사용자 데이터 액세스가 없습니다.

CLR(공용 언어 런타임) 식이 포함된 계산 열을 인덱싱하려면 열이 결정적이어야 하고 PERSISTED로 표시되어야 합니다. CLR 사용자 정의 형식 식은 계산 열 정의에서 허용됩니다. CLR 사용자 정의 형식인 계산 열은 형식이 비교 가능한 한 인덱싱할 수 있습니다. 자세한 내용은 CLR 사용자 정의 형식을 참조하세요.

CAST 및 CONVERT

SQL Server의 인덱싱된 계산 열에서 날짜 데이터 형식의 문자열 리터럴을 참조할 때 결정적 날짜 형식 스타일을 사용하여 리터럴을 원하는 날짜 형식으로 명시적으로 변환하는 것이 좋습니다. 결정적 날짜 형식 스타일 목록은 CAST 및 CONVERT를 참조하세요.

자세한 내용은 날짜 값으로 리터럴 날짜 문자열의 비결정적 변환을 참조하세요.

호환성 수준

호환성 수준을 80 이전으로 설정하지 않는 한 데이터 정렬 간에 유니코드가 아닌 문자 데이터의 암시적 변환은 비결정적인 것으로 간주됩니다.

데이터베이스 호환성 수준이 90으로 설정된 경우 이러한 식을 포함하는 계산 열에 인덱스를 만들 수 없습니다. 그러나 업그레이드된 데이터베이스에서 이러한 식을 포함하는 기존 계산 열은 유지 관리가 가능합니다. 문자열에서 날짜로의 암시적 변환이 포함된 인덱싱된 계산 열을 사용하는 경우 인덱스 손상 가능성을 방지하려면 데이터베이스 및 애플리케이션에서 LANGUAGE 설정과 DATEFORMAT 설정이 일치하는지 확인합니다.

호환성 수준 90은 SQL Server 2005(9.x)에 해당합니다.

정밀도 요구 사항

computed_column_expression은 정확해야 합니다. computed_column_expression은 다음 조건 중 하나 이상이 충족되는 경우 정확합니다.

  • float 또는 real 데이터 형식의 식이 아닙니다.

  • 해당 정의에는 float 또는 real 데이터 형식을 사용하지 않습니다. 예를 들어 다음 문에서 열 yint이고 결정적이지만 정확하지는 않습니다.

    CREATE TABLE t2 (a int, b int, c int, x float,
        y AS CASE x
              WHEN 0 THEN a
              WHEN 1 THEN b
              ELSE c
          END);
    

참고 항목

모든 float 또는 real 식은 부정확한 것으로 간주되며 인덱스의 키가 될 수 없습니다. float 또는 real 식은 인덱싱된 뷰에서 사용할 수 있지만 키로 사용할 수는 없습니다. 계산 열의 경우도 마찬가지입니다. 모든 함수, 식 또는 사용자 정의 함수는 float 또는 real 식이 포함된 경우 정확하지 않은 것으로 간주됩니다. 여기에는 논리적 항목(비교)이 포함됩니다.

COLUMNPROPERTY 함수의 IsPrecise 속성은 computed_column_expression이 정확한지를 보고합니다.

데이터 형식 요구 사항

  • 계산 열에 대해 정의된 computed_column_expressiontext, ntext 또는 image 데이터 형식으로 평가할 수 없습니다.
  • image, ntext, text, varchar(max), nvarchar(max), varbinary(max), xml 데이터 형식에서 파생된 계산 열은 계산 열 데이터 형식이 인덱스 키 열로 허용된다면 인덱싱할 수 있습니다.
  • image, ntexttext 데이터 형식에서 파생된 계산 열의 경우 해당 데이터 형식을 키가 아닌 인덱스 열로 사용할 수 있으면 비클러스터형 인덱스에서 키가 아닌(포함된) 열이 될 수 있습니다.

SET 옵션 요구 사항

  • ANSI_NULLS 연결 수준 옵션은 계산 열을 정의하는 CREATE TABLE 문 또는 ALTER TABLE 문이 실행될 때 ON으로 설정해야 합니다. OBJECTPROPERTY 함수의 IsAnsiNullsOn 속성을 통해 이 옵션이 ON으로 설정되었는지 여부를 알 수 있습니다.

  • 인덱스가 만들어지는 연결과 인덱스의 값을 변경할 INSERT, UPDATE 또는 DELETE 문을 시도하는 모든 연결은 6개의 SET 옵션이 ON으로 설정되고 하나의 옵션이 OFF로 설정되어야 합니다. 최적화 프로그램은 동일한 옵션 설정이 없는 연결에서 실행되는 SELECT 문에 대해 계산 열의 인덱스를 무시합니다.

    NUMERIC_ROUNDABORT 옵션은 OFF로 설정하고 다음 옵션은 ON으로 설정해야 합니다.

    • ANSI_NULLS
    • ANSI_PADDING
    • ANSI_WARNINGS
    • ARITHABORT
    • CONCAT_NULL_YIELDS_NULL
    • QUOTED_IDENTIFIER

참고 항목

데이터베이스 호환성 수준이 90 이상으로 설정된 경우 ANSI_WARNINGSON으로 설정하면 암시적으로 ARITHABORTON으로 설정됩니다.

지속형 계산 열에 인덱스 만들기

경우에 따라 아직 결정적이지만 정확하지 않은 식으로 정의된 계산된 열을 만들 수 있습니다. CREATE TABLE 또는 ALTER TABLE 문에서 열이 PERSISTED로 표시된 경우에 이 작업을 수행할 수 있습니다.

즉, 데이터베이스 엔진 은 계산된 값을 테이블에 저장하고 계산 열이 종속된 다른 열이 업데이트되면 해당 값을 업데이트합니다. 데이터베이스 엔진 은 열에 인덱스를 만들 때와 이 인덱스가 쿼리에서 참조될 때 이러한 지속형 값을 사용합니다.

이 옵션을 사용하면 데이터베이스 엔진이 계산 열 식을 반환하는 함수, 특히 .NET Framework에서 만든 CLR 함수가 결정적이고 정확한지 여부를 정확하게 증명할 수 없는 경우 계산 열에 인덱스를 만들 수 있습니다.

참고 항목

계산된 열에는 필터링된 인덱스를 만들 수 없습니다.

다음 단계