SQL-Server에서 계산 열의 이상한 동작


12

70-433 시험 책을 읽는 동안 나는 효과가없는 것을 생각했지만 실제로는 그렇지 않다고 생각합니다. 구절은 다음과 같이 읽습니다.

열은 또한 PERSISTED 로 표시되어야합니다. 즉, SQL Server는 계산 된 열 식의 결과를 쿼리에서 참조 할 때마다 계산하지 않고 데이터 행에 실제로 저장합니다.

이것으로부터 나는 두 가지를 이해합니다.

  1. 비 지속 계산 된 열은이 질의에 언급 될 때마다 계산된다
  2. 계산 된 열에는 아무것도 저장되지 않으므로 열에 대해 인덱스를 만들 수 없다고 가정합니다.

그것을 읽은 후, 나는 이전 프로젝트에서 비 지속 열에 인덱스를 만들었 기 때문에 이것이 조금 이상하다고 생각했습니다.

지속되지 않고 장기적으로 해로운 것에 대해 어떻게 인덱스를 만들 수 있습니까?


이를 증명하기 위해 다음 SQL 문을 실행했습니다.

CREATE TABLE testTable
(
    ID INT IDENTITY(1,1) PRIMARY KEY,
    telephone VARCHAR(14),
    c_areaCode AS (SUBSTRING(telephone,0,5)),
    cp_areaCode AS (SUBSTRING(telephone,0,5)) PERSISTED
)

INSERT INTO testTable VALUES('09823 000000');
INSERT INTO testTable VALUES('09824 000000');
INSERT INTO testTable VALUES('09825 000000');

CREATE NONCLUSTERED INDEX IX_NotPersisted ON testTable(c_areaCode);
CREATE NONCLUSTERED INDEX IX_Persisted ON testTable(cp_areaCode);

그런 다음 다음 쿼리를 실행하십시오.

DBCC FREEPROCCACHE
DBCC FREESYSTEMCACHE('ALL');
DBCC DROPCLEANBUFFERS
GO
SELECT cp_areaCode FROM testTable;
GO
SELECT c_areaCode FROM testTable;

위의 코드에 대한 쿼리 계획을 살펴본 결과 두 선택 쿼리 모두 비 지속적 인덱스를 사용하고 있음을 알 수 있습니다. 또 어떻게?

여기에 이미지 설명을 입력하십시오


70-433 권의 책을 가진 사람들의 경우, 인용 된 텍스트는 111 페이지의 맨 위에 있습니다.
Stuart Blackler

답변:


9

2. 계산 열에 아무것도 저장되지 않으므로 열에 대해 인덱스를 만들 수 없다고 가정합니다.

이 가정은 사실이 아니며 두 가지 모두 색인을 생성 할 수 있습니다 . 계산 된 열은 어느 경우 에나 결정 론적 이어야 하지만 계산 된 열이 지속되면 계산도 정확 해야한다는 요구 사항 이 완화됩니다 (즉, 부동 소수점 연산이 포함될 수 있음).

지속되지 않고 장기적으로 해로운 것에 대해 어떻게 인덱스를 만들 수 있습니까?

함수의 결과는 두 경우 모두 인덱스 에 '지속적' 입니다 . 유일한 차이점은 테이블에 유지되는지 여부입니다.

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