비 지속 계산 열 SQL Server에서 비 클러스터형 인덱스 만들기


10

SQL Server가 비 지속적 계산 열을 실제로 저장하는 방법에 대한 설명서를 찾는 데 어려움을 겪고 있습니다.

다음 예를 보자.

--SCHEMA
CREATE TABLE dbo.Invoice
(
    InvoiceID INT IDENTITY(1, 1) PRIMARY KEY,
    CustomerID INT FOREIGN KEY REFERENCES dbo.Customer(CustomerID),
    InvoiceStatus NVARCHAR(50) NOT NULL,
    InvoiceStatusID AS CASE InvoiceStatus 
                         WHEN 'Sent' THEN 1 
                         WHEN 'Complete' THEN 2
                         WHEN 'Received' THEN 3
                       END
)
GO

--INDEX
CREATE NONCLUSTERED INDEX IX_Invoice ON Invoice
(
    CustomerID ASC
)
INCLUDE
(
    InvoiceStatusID
)
GO

리프 수준에 저장되지만 값이 유지되지 않으면 어떻게 저장됩니까? 이 상황에서 인덱스가 SQL Server가 이러한 행을 찾는 데 어떻게 도움이됩니까?

도움을 주시면 감사하겠습니다.

많은 감사합니다

편집하다:

이에 대한 답변을 해준 Brent & Aaron에게 감사 의 말씀을 전 합니다.


5
테이블의 데이터 페이지에는 유지되지 않지만 index 페이지에는 유지됩니다 .
Aaron Bertrand

비 지속적 계산 열은 실제로 테이블에 저장되지 않습니다. 그들은 가상 열입니다. 해당 값은 쿼리에서 참조 될 때마다 다시 계산됩니다. 이 참조를 참조하십시오 .
Kin Shah

답변:


11

SQL Server가 계산 된 필드에서 인덱스를 만들면 계산 된 필드는 해당 시점의 디스크에 기록되지만 해당 인덱스의 8K 페이지에만 기록됩니다. SQL Server는 클러스터형 인덱스를 읽을 때 InvoiceStatusID를 계산할 수 있습니다. 클러스터형 인덱스에 해당 데이터를 쓸 필요가 없습니다.

dbo.Invoice에서 행을 삭제 / 업데이트 / 삽입하면 인덱스의 데이터가 최신 상태로 유지됩니다. InvoiceStatus가 변경되면 SQL Server는 IX_Invoice도 업데이트한다는 것을 알고 있습니다.

이를 직접 확인할 수있는 가장 좋은 방법은 실제로 수행하는 것입니다. 이러한 개체를 만들고 InvoiceStatusID 필드에 닿는 업데이트를 실행하십시오. 인덱스 업데이트가 발생하는 위치를 확인하려면 실행 계획을 게시하십시오 (PasteThePlan.com이 도움이 됨).


1
@ Uberzen1 아니요, 설명했듯이 삽입 / 업데이트시 인덱스 페이지에 기록됩니다. 인덱스를 사용하여 열에 액세스하는 경우 아무것도 다시 계산할 필요가 없습니다.
Aaron Bertrand

아! 나는 지금 당신과 함께, 미안 해요!
Uberzen1

6
@ blobbles는 잘 위반하지는 않지만 브렌트에 있다고 생각하지 않습니다. 그들은 동일한 XML을 드롭 박스에 붙여 넣을 수 있습니다. MSDN 포럼은 기본적으로 온라인 어디에서나 ... 이제 모든 온라인 서비스는 파일을 업로드하는 사람들이 공개 할 수있는 비밀에 대해 책임을 져야합니까?
Aaron Bertrand

2
@blobbles 예, 사람들이 지나치게 공유하는 것을 막을 수는 없습니다. 그건 그렇고, 인스 타 그램에서 나를 따라 오십시오-나는 BrentO입니다-나는 거기서 아침 식사 사진을 공유합니다. ;-)
브렌트 오자르

4
개인 정보 보호 링크의 @blobbles에 다음과 같이 명시되어 있습니다. 복사 / 붙여 넣기 한 데이터는 공개 입니다. 누구나 읽을 수 있습니다. 보안이 없습니다.
ypercubeᵀᴹ

8

인덱싱 된 비 지속적 계산 열의 값은 테이블 의 데이터 페이지에 유지되지 않지만 인덱스 의 페이지에는 유지됩니다 . 0, 1 또는 여러 인덱스로 유지되는지 여부에 관계없이 테이블에 지속되지 않습니다.

예를 들어 브렌트의 설명을 설명하기 위해 행을 삽입하겠습니다.

INSERT dbo.Invoice(CustomerID, InvoiceStatus) VALUES(1,N'Sent');

이제 색인 페이지를 보자.

DBCC TRACEON(3604, -1);
DBCC IND(N'dbname', N'dbo.Invoice', 2);

(분명히 변경 dbname하면 색인 ID가 2가 아닐 수 있습니다.)

출력 (귀하의 의견이 다를 것입니다) :

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

마지막으로 페이지 PageType2를 검사합니다 .

DBCC PAGE(7, 1, 584, 3);

데이터베이스 ID와 일치하도록 7을 변경해야 할 수 있으며 여러 데이터 파일 PageFID이있는 경우 첫 번째 결과 와 일치하도록 두 번째 인수를 변경해야 할 수도 있습니다.

산출:

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

색인 페이지에 있습니다.


고마워요, Aaron. 내가 처음 질문 한 이유는 실제 세계에서 비슷한 인덱스를 배포하는 데 실제로 어려움을 겪고 있기 때문에 문제를 파악할 수 있도록 후드에서 무슨 일이 일어나고 있는지 정확히 이해하고 싶기 때문입니다. 감사합니다!
Uberzen1

1
@ Uberzen1 "실제 문제"를 정의 할 수 있습니까? 문제 에 대해 질문 하시겠습니까?
Aaron Bertrand

아마 할 수도 있습니다. 먼저 좀 더 직접 파고 들었지만 인덱스 생성 명령문이 정확히 무엇을하는지 내 머리에 넣고 싶었습니다. TLDR은 다음과 같습니다. 위의 송장 테이블과 비슷한 큰 테이블이 있으며 약 400m 레코드가 있으며 불행히도 OrderStatus 열이 그 중간에 흩어져서 색인 생성 등이 약간 고통 스럽습니다. 지금까지 계산 열을 추가하여 varchar 필드를 유지하고 자체 테이블로 옮길 것입니다. 1/2
Uberzen1

5
@ Uberzen1 예, 인덱스에 쓸 때 계산 열이 실제로 디스크에 구체화되기 때문에 모든 활동을 기록해야합니다. 해결 방법은 계산 된 열에 의존하는 것을 중지하는 것입니다. 해당 표현식을 뷰 또는 임시 쿼리에 넣고, 옵션이 아닌 경우 새 Null 허용 열을 만들 수 있습니다 (로그 종료를 피하기 위해) 그런 다음 계산 열을 삭제하고 새 열의 이름을 바꾼 다음 DML을 변경하여 수동으로 작성하십시오. 그러나 실제로 중복 정보이기 때문에 기존 데이터에서 얻을 수 있으므로 첫 번째 옵션을 선택합니다.
Aaron Bertrand

2
고마워 Aaron. 그것도 내가 해결책으로 갔기 때문에 그 견해를 언급하는 것을 언급하게되어 기쁩니다. 아마도 그 아이디어를 다시 방문 할 때입니다!
Uberzen1

7

PERSISTED계산 열의 속성 은 값이 인덱스에 유지되는지 여부와 관계없이 값이 테이블에 유지되는지 (클러스터형 인덱스 또는 힙)와 관련이 있습니다.

CREATE INDEX계산 열 및 인덱스에 대한 제한 요구 사항 이 있습니다.

결정적이고 정확하거나 부정확 한 계산 열은 열을 포함 할 수 있습니다. image, ntext, text, varchar (max), nvarchar (max), varbinary (max) 및 xml 데이터 형식에서 파생 된 계산 열은 계산 열 데이터 형식이 포함 된 경우 키가 아닌 열에 포함될 수 있습니다. 기둥. 자세한 내용은 계산 열 인덱스를 참조하십시오.

계산 열이 유지되는지 여부에는 제한이 없습니다.

추가로 (인덱스의 주요 부분에 포함되지 않고 계산 된 열에 대해) :

계산 열에서 인덱스를 만들 수 있습니다. 또한 계산 열에는 속성이있을 수 있습니다 PERSISTED. 이는 데이터베이스 엔진이 계산 된 값을 테이블에 저장하고 계산 된 열이 종속 된 다른 열이 업데이트 될 때 해당 값을 업데이트 함을 의미합니다. 데이터베이스 엔진은 열에서 인덱스를 만들 때와 인덱스가 쿼리에서 참조 될 때 이러한 지속 된 값을 사용합니다.

계산 열을 인덱싱하려면 계산 열이 결정적이고 정확해야합니다. 그러나이 PERSISTED속성을 사용하면 다음을 포함하도록 인덱싱 가능한 계산 열 유형이 확장됩니다.

...

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