이것은 실제로 인덱스 및 데이터 유형에 따라 다릅니다.
Stack Overflow 데이터베이스를 예로 사용하면 다음과 같이 Users 테이블이 나타납니다.
ID 열에 PK / CX가 있습니다. Id로 정렬 된 테이블 데이터 전체입니다.
이 인덱스를 유일한 인덱스로 사용하면 SQL은 해당 항목이 없으면 LOB 열을 메모리로 읽어야합니다.
DBCC DROPCLEANBUFFERS-- Don't run this anywhere near prod.
SET STATISTICS TIME, IO ON
SELECT u.Id
INTO #crap1
FROM dbo.Users AS u
통계 시간과 io 프로파일은 다음과 같습니다 :
Table 'Users'. Scan count 7, logical reads 80846, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 2406 ms, elapsed time = 446 ms.
ID에 비 클러스터형 인덱스를 추가하면
CREATE INDEX ix_whatever ON dbo.Users (Id)
이제 쿼리를 충족하는 훨씬 작은 인덱스가 있습니다.
DBCC DROPCLEANBUFFERS-- Don't run this anywhere near prod.
SELECT u.Id
INTO #crap2
FROM dbo.Users AS u
여기에 프로필 :
Table 'Users'. Scan count 7, logical reads 6587, physical reads 0, read-ahead reads 6549, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 2344 ms, elapsed time = 384 ms.
우리는 훨씬 적은 읽기를 수행하고 약간의 CPU 시간을 절약 할 수 있습니다.
테이블 정의에 대한 추가 정보가 없으면 실제로 측정하려는 것을 더 잘 재현하려고 시도 할 수 없습니다.
그러나 당신은 그 고독한 열에 특정 색인이 없으면 다른 열 / 필드도 스캔 될 것이라고 말하고 있습니까? 이것이 행 스토어 테이블 디자인에 내재 된 단점일까요? 관련이없는 필드가 스캔되는 이유는 무엇입니까?
예, 이것은 rowstore 테이블에만 해당됩니다. 데이터는 행별로 데이터 페이지에 저장됩니다. 페이지의 다른 데이터가 쿼리와 관련이 없더라도 전체 행> 페이지> 인덱스를 메모리로 읽어야합니다. 나는 다른 열이 존재하는 페이지가 쿼리와 관련된 단일 값을 검색하기 위해 스캔되는 것처럼 "스캔"된다고 말하지 않을 것입니다.
ol '전화 번호부 예제 사용 : 전화 번호 만 읽는 경우에도 페이지를 넘기면 전화 번호와 함께 성, 이름, 주소 등이 바뀝니다.