클러스터형 인덱스를 사용할 때 "out of the row"필드를 읽습니까?


10

VARCHAR(MAX)/NVARCHAR(MAX)열이 사용될 때 데이터가 저장 된다는 것을 알고 있습니다 out of the row. 데이터 행에는 '큰 값'이 저장된 다른 위치에 대한 포인터가 있습니다.

다음과 같은 질문이 있습니다.

  1. 각 필드는 저장 out of the row을 또는 유일한 max사람을?
  2. clustered index전체 레코드를 읽기 위해 테이블을 사용하는 경우 행 외부에 저장된 필드도 읽습니까?

VARCHAR (MAX) 또는 NVARCHAR (MAX)는 '큰 값 유형'으로 간주됩니다. 큰 값 유형은 일반적으로 'out of row'로 저장됩니다. 그것은 ...


2
마지막 인용 부분은 어디에서 왔습니까? 올바르지 않습니다.
Paul White 9


3
원본 MSDN 스레드의 전체 텍스트 (Jacob Sebastian)가 정확합니다. 스택 오버플로 "인용"은 그 중 상당 부분을 잃습니다. 위에서 인용 한 작은 부분은 모든 중요한 부분을 생략합니다.)
Paul White 9

답변:


13

VARCHAR(MAX)/NVARCHAR(MAX)열을 사용할 때 데이터가 행 외부에 저장 된다는 것을 알고 있습니다 ...

실제로, large value types out of row옵션을 사용하여 설정할 수있는 옵션 설정에 따라 다릅니다 sp_tableoption. 로부터 문서 :

BOL 추출물

기본 입니다 MAX값을 저장할 수 의 행 가 맞는 경우, 8000 바이트까지. sp_tableoption기본값을 변경 하지 않은 경우 MAX데이터는 행 안에 저장 될 가능성이 높습니다.

즉, MAX8000 바이트를 초과하지 않는 값에 데이터 유형 을 사용하는 것은 좋지 않습니다. 대신 비 MAX 유형을 사용하십시오. MAXSQL Server는 최대 2GB 크기의 데이터를 처리 할 수 ​​있도록 준비해야하므로 다른 모든 것 외에도 유형을 처리 할 때 성능이 크게 저하되는 경우가 많습니다 .

각 필드는 행 외부에 저장됩니까 아니면 최대 필드에만 저장됩니까?

MAX그들 만 . 또한 이전 행 내 MAX열이 행 외부로 이동되면 해당 행의 해당 열만 영향을받습니다. 행 내부에서 행 외부 LOB구조 에 대한 포인터로 바뀝니다 . MAX가 아닌 열이 행 밖으로 이동할 수있는 환경도 있습니다.

테이블의 클러스터형 인덱스를 사용하여 전체 레코드를 읽는 경우 행 외부에 저장된 필드도 읽습니까?

클러스터형 인덱스를 스캔하면 행 내 데이터 만 통과합니다. 쿼리에 행 외부 데이터가 필요한 경우 행 내부 포인터를 사용하여 조회합니다.


이것은 항상 사실 Scanning the clustered index traverses only in-row data.입니까? 예를 들어, NVARCHAR(MAX)필드 값을 표시 하려면 in-row-data(값이 행 외부에 저장되어있는 경우) 로만 작업 할 수있는 방법은 무엇입니까? 또는 클러스터 인덱스를 사용하는 경우 (커버링 인덱스가 없기 때문에) 필드 를 work사용 하지 않을 NVARCHAR(MAX)경우 SQL Server가이를보고 out-of-row데이터 조회를 건너 뛸만큼 영리 합니까?
gotqn

답변 해주셔서 감사합니다. 마지막으로 두 개의 열이 int있고 열만 nvarchar(max)선택하는 경우 intSQL Server는 데이터를 사용하지 않을 것이라는 것을 알고 read있으므로 out-of-row데이터에 리소스를 낭비하지 않습니다 .
gotqn

고마워 아주 좋습니다. sp_tableoption클러스터 된 인덱스 탐색 / 스캔을 많이 할 때 행 크기를 줄이기 위해 자주 사용하지 않는 모든 것을 테이블에서 사용할 수 있는 것으로 보입니다 .
gotqn

3
@gotqn 예. 오프 행은 이전 LOB 유형에 대한 기본이었다 text, ntext그리고 image. 물론 큰 유형을 별도의 테이블에 저장할 수도 있습니다.
Paul White 9

4

대형 오브젝트 스토리지에 대한이 동작은 테이블 설정으로 제어 할 수 있습니다.

exec sp_tableoption N'MyTable', 'large value types out of row', <'ON' or 'OFF'>

SQL Server 2012 설명서는 http://msdn.microsoft.com/en-us/library/ms173530.aspx를 참조하십시오.

따라서 공간이 사용되거나 행 내 또는 행 외부에서 저장되는 위치를 제어 할 수 있습니다.


고마워, 나는 당신이 이것을 제어 할 수 있다는 것을 정말로 몰랐습니다.
gotqn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.