계산 열의 인덱스Indexes on Computed Columns

이 항목은 다음에 적용됩니다. 예SQL Server(2016부터)예Azure SQL Database아니요Azure SQL Data Warehouse아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

다음 요구 사항을 충족하면 계산 열에 인덱스를 정의할 수 있습니다.You can define indexes on computed columns as long as the following requirements are met:

  • 소유권 요구 사항Ownership requirements

  • 결정성 요구 사항Determinism requirements

  • 정밀도 요구 사항Precision requirements

  • 데이터 형식 요구 사항Data type requirements

  • SET 옵션 요구 사항SET option requirements

    Ownership RequirementsOwnership Requirements

    계산 열에서 모든 함수 참조의 소유자는 테이블 소유자와 같아야 합니다.All function references in the computed column must have the same owner as the table.

    Determinism RequirementsDeterminism Requirements

중요

지정된 입력 집합에 대해 항상 같은 결과 집합을 반환하는 식은 결정적입니다.Expressions are deterministic if they always return the same result for a specified set of inputs. COLUMNPROPERTY 함수의 IsDeterministic 속성은 computed_column_expression 이 결정적인지 여부를 보고합니다.The IsDeterministic property of the COLUMNPROPERTY function reports whether a computed_column_expression is deterministic.

computed_column_expression 은 결정적이어야 합니다.The computed_column_expression must be deterministic. computed_column_expression 은 다음 조건 중 하나 이상이 충족되는 경우 결정적입니다.A computed_column_expression is deterministic when one or more of the following is true:

  • 식에서 참조하는 모든 함수가 결정적이고 정확합니다.All functions that are referenced by the expression are deterministic and precise. 이러한 함수에는 사용자 정의 함수와 기본 제공 함수가 포함됩니다.These functions include both user-defined and built-in functions. 자세한 내용은 Deterministic and Nondeterministic Functions을 참조하세요.For more information, see Deterministic and Nondeterministic Functions. 계산 열이 PERSISTED일 경우 함수가 정확하지 않을 수 있습니다.Functions might be imprecise if the computed column is PERSISTED. 자세한 내용은 이 항목의 뒤에 나오는 지속형 계산 열에 인덱스 만들기 를 참조하십시오.For more information, see Creating Indexes on Persisted Computed Columns later in this topic.

  • 식에서 참조하는 모든 열은 계산 열이 있는 테이블에서 가져옵니다.All columns that are referenced in the expression come from the table that contains the computed column.

  • 여러 행에서 데이터를 끌어 오는 열 참조가 없습니다.No column reference pulls data from multiple rows. 예를 들어 SUM 또는 AVG와 같은 집계 함수는 여러 행의 데이터에 의존하므로 computed_column_expression 은 비결정적입니다.For example, aggregate functions such as SUM or AVG depend on data from multiple rows and would make a computed_column_expression nondeterministic.

  • computed_column_expression 에는 시스템 데이터 액세스 또는 사용자 데이터 액세스가 없습니다.The computed_column_expression has no system data access or user data access.

    CLR(공용 언어 런타임) 식이 포함된 계산 열에 인덱스를 만들려면 열이 결정적이어야 하고 PERSISTED로 표시되어야 합니다.Any computed column that contains a common language runtime (CLR) expression must be deterministic and marked PERSISTED before the column can be indexed. CLR 사용자 정의 형식 식은 계산 열 정의에서 허용됩니다.CLR user-defined type expressions are allowed in computed column definitions. CLR 사용자 정의 형식의 계산 열은 형식이 비교 가능하면 인덱스를 만들 수 있습니다.Computed columns whose type is a CLR user-defined type can be indexed as long as the type is comparable. 자세한 내용은 CLR 사용자 정의 형식을 참조하세요.For more information, see CLR User-Defined Types.

참고

SQL ServerSQL Server에서 인덱싱된 계산 열의 날짜 데이터 형식의 문자열 리터럴을 참조할 때 결정적 날짜 형식 스타일을 사용하여 리터럴을 원하는 날짜 유형으로 명시적으로 변환하는 것이 좋습니다.When you refer to string literals of the date data type in indexed computed columns in SQL ServerSQL Server, we recommend that you explicitly convert the literal to the date type that you want by using a deterministic date format style. 결정적 날짜 형식 스타일 목록은 CAST 및 CONVERT를 참조하십시오.For a list of the date format styles that are deterministic, see CAST and CONVERT. 데이터베이스 호환성 수준이 80 이하로 설정되지 않은 경우 문자열을 날짜 데이터 형식으로 암시적으로 변환하는 작업과 관련된 식은 비결정적인 것으로 간주됩니다.Expressions that involve implicit conversion of character strings to date data types are considered nondeterministic, unless the database compatibility level is set to 80 or earlier. 서버 세션의 LANGUAGEDATEFORMAT 설정에 따라 결과가 달라지기 때문입니다.This is because the results depend on the LANGUAGE and DATEFORMAT settings of the server session. 예를 들어 ' CONVERT (datetime, '30 listopad 1996', 113) ' 문자열이 다른 언어에서는 다른 월을 의미하므로30 listopad 1996식의 결과는 LANGUAGE 설정에 따라 달라집니다.For example, the results of the expression CONVERT (datetime, '30 listopad 1996', 113) depend on the LANGUAGE setting because the string '30 listopad 1996' means different months in different languages. 마찬가지로 DATEADD(mm,3,'2000-12-01')에서는 DATEFORMAT 설정에 따라 데이터베이스 엔진Database Engine 식의 '2000-12-01' 문자열을 해석합니다.Similarly, in the expression DATEADD(mm,3,'2000-12-01'), the 데이터베이스 엔진Database Engine interprets the string '2000-12-01' based on the DATEFORMAT setting.

호환성 수준이 80 이하로 설정되지 않은 경우에 데이터 정렬 간의 비유니코드 문자 데이터를 암시적으로 변환하는 작업도 비결정적인 것으로 간주됩니다.Implicit conversion of non-Unicode character data between collations is also considered nondeterministic, unless the compatibility level is set to 80 or earlier.

데이터베이스 호환성 수준 설정이 90이면 이러한 식이 포함된 계산 열에 인덱스를 만들 수 없습니다.When the database compatibility level setting is 90, you cannot create indexes on computed columns that contain these expressions. 그러나 업그레이드된 데이터베이스로부터 이러한 식을 포함하는 기존 계산 열은 유지할 수 있습니다.However, existing computed columns that contain these expressions from an upgraded database are maintainable. 문자열에서 날짜로의 암시적 변환이 포함된 인덱싱된 계산 열을 사용하는 경우 인덱스 손상을 방지하려면 데이터베이스와 응용 프로그램에서 LANGUAGE 및 DATEFORMAT 설정이 일치하는지 확인합니다.If you use indexed computed columns that contain implicit string to date conversions, to avoid possible index corruption, make sure that the LANGUAGE and DATEFORMAT settings are consistent in your databases and applications.

Precision RequirementsPrecision Requirements

computed_column_expression 은 정확해야 합니다.The computed_column_expression must be precise. computed_column_expression 은 다음 조건 중 하나 이상이 충족되는 경우 정확합니다.A computed_column_expression is precise when one or more of the following is true:

  • float 또는 real 데이터 형식의 식이 아닙니다.It is not an expression of the float or real data types.

  • 정의에 float 또는 real 데이터 형식을 사용하지 않습니다.It does not use a float or real data type in its definition. 예를 들어 다음 문에서 열 yint 이고 결정적이지만 정확하지는 않습니다.For example, in the following statement, column y is int and deterministic but not precise.

    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 식은 인덱싱된 뷰에서 사용할 수 있지만 키로는 사용할 수 없습니다.Any float or real expression is considered imprecise and cannot be a key of an index; a float or real expression can be used in an indexed view but not as a key. 계산 열의 경우에도 마찬가지입니다.This is true also for computed columns. 함수, 식 또는 사용자 정의 함수에 float 또는 real 식이 포함되어 있으면 정확하지 않은 것으로 간주됩니다.Any function, expression, or user-defined function is considered imprecise if it contains any float or real expressions. 논리 식(비교)이 여기에 포함됩니다.This includes logical ones (comparisons).

COLUMNPROPERTY 함수의 IsPrecise 속성은 computed_column_expression 이 정확한지 여부를 보고합니다.The IsPrecise property of the COLUMNPROPERTY function reports whether a computed_column_expression is precise.

Data Type RequirementsData Type Requirements

  • 계산 열에 대해 정의된 computed_column_expressiontext, ntext또는 image 데이터 형식으로 계산할 수 없습니다.The computed_column_expression defined for the computed column cannot evaluate to the text, ntext, or image data types.

  • image, ntext, text, varchar(max), nvarchar(max), varbinary(max)xml 데이터 형식에서 파생된 계산 열의 경우 해당 데이터 형식을 인덱스 키 열로 사용할 수 있으면 인덱스를 만들 수 있습니다.Computed columns derived from image, ntext, text, varchar(max), nvarchar(max), varbinary(max), and xml data types can be indexed as long as the computed column data type is allowable as an index key column.

  • image, ntexttext 데이터 형식에서 파생된 계산 열의 경우 해당 데이터 형식을 키가 아닌 인덱스 열로 사용할 수 있으면 비클러스터형 인덱스에서 키가 아닌(포함된) 열이 될 수 있습니다.Computed columns derived from image, ntext, and text data types can be nonkey (included) columns in a nonclustered index as long as the computed column data type is allowable as a nonkey index column.

    SET Option RequirementsSET Option Requirements

  • 계산 열을 정의하는 CREATE TABLE 또는 ALTER TABLE 문이 실행될 때 ANSI_NULLS 연결 수준 옵션이 ON으로 설정되어야 합니다.The ANSI_NULLS connection-level option must be set to ON when the CREATE TABLE or ALTER TABLE statement that defines the computed column is executed. OBJECTPROPERTY 함수의 IsAnsiNullsOn 속성을 통해 이 옵션이 ON으로 설정되었는지 여부를 알 수 있습니다.The OBJECTPROPERTY function reports whether the option is on through the IsAnsiNullsOn property.

  • 인덱스가 만들어진 연결과 인덱스에서 값을 변경하는 INSERT, UPDATE 또는 DELETE 문을 실행하려 하는 모든 연결에서 6개의 SET 옵션이 ON으로 설정되어야 하고 하나의 옵션만 OFF로 설정되어야 합니다.The connection on which the index is created, and all connections trying INSERT, UPDATE, or DELETE statements that will change values in the index, must have six SET options set to ON and one option set to OFF. 최적화 프로그램은 옵션 설정이 이와 다른 연결에서 실행된 SELECT 문에 대해 계산 열의 인덱스를 무시합니다.The optimizer ignores an index on a computed column for any SELECT statement executed by a connection that does not have these same option settings.

    • NUMERIC_ROUNDABORT 옵션이 OFF로 설정되어야 하고 다음 옵션이 ON으로 설정되어야 합니다.The NUMERIC_ROUNDABORT option must be set to OFF, and the following options must be set to ON:

    • ANSI_NULLSANSI_NULLS

    • ANSI_PADDINGANSI_PADDING

    • ANSI_WARNINGSANSI_WARNINGS

    • ARITHABORTARITHABORT

    • CONCAT_NULL_YIELDS_NULLCONCAT_NULL_YIELDS_NULL

    • QUOTED_IDENTIFIERQUOTED_IDENTIFIER

      데이터베이스 호환성 수준이 90 이상으로 설정된 경우 ANSI_WARNINGS를 ON으로 설정하면 암시적으로 ARITHABORT가 ON으로 설정됩니다.Setting ANSI_WARNINGS to ON implicitly sets ARITHABORT to ON when the database compatibility level is set to 90 or higher.

지속형 계산 열에 인덱스 만들기 Creating Indexes on Persisted Computed Columns

CREATE TABLE 또는 ALTER TABLE 문에서 열이 PERSISTED로 표시된 경우 결정적이지만 정확하지 않은 식으로 정의된 계산 열에 인덱스를 만들 수 있습니다.You can create an index on a computed column that is defined with a deterministic, but imprecise, expression if the column is marked PERSISTED in the CREATE TABLE or ALTER TABLE statement. 즉, 데이터베이스 엔진Database Engine 은 계산된 값을 테이블에 저장하고 계산 열이 종속된 다른 열이 업데이트되면 해당 값을 업데이트합니다.This means that the 데이터베이스 엔진Database Engine stores the computed values in the table, and updates them when any other columns on which the computed column depends are updated. 데이터베이스 엔진Database Engine 은 열에 인덱스를 만들 때와 이 인덱스가 쿼리에서 참조될 때 이러한 지속형 값을 사용합니다.The 데이터베이스 엔진Database Engine uses these persisted values when it creates an index on the column, and when the index is referenced in a query. 이 옵션을 사용하면 데이터베이스 엔진Database Engine 이 계산 열 식을 반환하는 함수, 특히 .NET Framework.NET Framework에서 생성된 CLR 함수가 결정적이면서 동시에 정확한지 여부를 확실히 판단할 수 없을 때에도 계산 열에 인덱스를 만들 수 있습니다.This option enables you to create an index on a computed column when 데이터베이스 엔진Database Engine cannot prove with accuracy whether a function that returns computed column expressions, particularly a CLR function that is created in the .NET Framework.NET Framework, is both deterministic and precise.

COLUMNPROPERTY(Transact-SQL)COLUMNPROPERTY (Transact-SQL)