계산 열의 인덱스
적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance
다음 요구 사항이 충족되는 한 계산 열에서 인덱스를 정의할 수 있습니다.
- 소유권 요구 사항
- 결정성 요구 사항
- 정밀도 요구 사항
- 데이터 형식 요구 사항
- SET 옵션 요구 사항
참고 항목
SET QUOTED_IDENTIFIER
ON
는 계산 열 또는 인덱싱된 뷰에서 인덱스를 만들거나 변경할 때여야 합니다. 자세한 내용은 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
이러한 식을 포함하는 계산 열에 인덱스를 만들 수 없습니다. 그러나 업그레이드된 데이터베이스에서 이러한 식을 포함하는 기존 계산 열은 유지 관리할 수 있습니다. 암시적 문자열에서 날짜 변환으로의 변환이 포함된 인덱싱된 계산 열을 사용하는 경우 인덱스 손상 가능성을 방지하려면 데이터베이스 및 애플리케이션에서 해당 설정과 DATEFORMAT
설정이 LANGUAGE
일치하는지 확인합니다.
호환성 수준은 90
SQL Server 2005(9.x)에 해당합니다.
정밀도 요구 사항
computed_column_expression 정확해야 합니다. 다음 중 하나 이상이 true인 경우 computed_column_expression 정확합니다.
float 또는 real 데이터 형식의 식이 아닙니다.
해당 정의에는 float 또는 real 데이터 형식을 사용하지 않습니다. 예를 들어 다음 문에서 열
y
은 정형 적이고 결정적이지만 정확하지는 않습니다.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 식은 인덱싱된 뷰에서 사용할 수 있지만 키로 사용할 수는 없습니다. 계산 열의 경우도 마찬가지입니다. 모든 함수, 식 또는 사용자 정의 함수는 부동 또는실제 식이 포함된 경우 정확하지 않은 것으로 간주됩니다. 여기에는 논리적 항목(비교)이 포함됩니다.
함수의 COLUMNPROPERTY
속성은 IsPrecise
computed_column_expression 정확한지 여부를 보고합니다.
데이터 형식 요구 사항
- 계산 열에 대해 정의된 computed_column_expression 텍스트, ntext 또는 이미지 데이터 형식으로 평가할 수 없습니다.
- 계산 열 데이터 형식이 인덱스 키 열로 허용되는 한 이미지, ntext, text, varchar(max), nvarchar(max), varbinary(max) 및 xml 데이터 형식에서 파생된 계산 열을 인덱싱할 수 있습니다.
- image, ntext및 text 데이터 형식에서 파생된 계산 열의 경우 해당 데이터 형식을 키가 아닌 인덱스 열로 사용할 수 있으면 비클러스터형 인덱스에서 키가 아닌(포함된) 열이 될 수 있습니다.
SET 옵션 요구 사항
ANSI_NULLS
연결 수준 옵션은 계산 열을 정의하는 문 또는ALTER TABLE
문이 실행될 때CREATE TABLE
로 설정ON
해야 합니다. OBJECTPROPERTY 함수는 옵션이 속성을 통해 설정되었는지 여부를 보고합니다IsAnsiNullsOn
.인덱스가 만들어지는 연결과 인
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
참고 항목
ANSI_WARNINGS
ON
데이터베이스 호환성 수준을 설정하거나 그 이상으로 설정할 때 암시적으로 설정하도록 90
설정합니다 ARITHABORT
ON
.
지속형 계산 열에 인덱스 만들기
경우에 따라 아직 결정적이지만 정확하지 않은 식으로 정의된 계산된 열을 만들 수 있습니다. 열이 or ALTER TABLE
문에 CREATE TABLE
표시 PERSISTED
되면 이 작업을 수행할 수 있습니다.
즉, 데이터베이스 엔진 은 계산된 값을 테이블에 저장하고 계산 열이 종속된 다른 열이 업데이트되면 해당 값을 업데이트합니다. 데이터베이스 엔진 은 열에 인덱스를 만들 때와 이 인덱스가 쿼리에서 참조될 때 이러한 지속형 값을 사용합니다.
이 옵션을 사용하면 데이터베이스 엔진이 계산 열 식을 반환하는 함수, 특히 .NET Framework에서 만든 CLR 함수가 결정적이고 정확한지 여부를 정확하게 증명할 수 없는 경우 계산 열에 인덱스를 만들 수 있습니다.
참고 항목
계산 열에는 필터링된 인덱 스만 만들 수 없습니다.
다음 단계
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기