2012-04-05 1 views
2

3 개의 열 (firstname, middlename, lastname)이있는 테이블이 있습니다.이 인덱스에는 인덱스가없고 모든 필드가 varchar입니다.전체 테이블 스캔이 모든 열 (모든 행)을 통해 읽습니까?

전체 테이블 스캔을 수행하여 주어진 firstname이 테이블에 있는지 확인하십시오. 오라클 (또는 MSSQL)도 다른 모든 컬럼을 읽어야합니까? (아니면 건너 뛰기에 충분히 똑똑합니까?).

첫 번째 열 대신 두 번째 열을 검색하면 어떨까요? 첫 번째 열을 읽어야합니까? 첫 번째 열이 2000 바이트에 가까운 데이터가있는 varchar 인 경우에는 어떻게됩니까? .. 모든 바이트를 읽어야합니까, 아니면 어떻게 든 건너 뛸 것인가?

답변

8

프로그래머는 '읽기'의 정의가 '메모리 주소를보고 모든 바이트를 읽습니다.'라는 정의가 있지만 데이터베이스의 경우이 정의가 올바르지 않습니다. 데이터베이스에서 '읽기'는 '디스크에 액세스하고 메모리의 데이터를 가져 오는'것을 의미합니다. Oracle과 SQL Server는 모두 페이지 지향 행 저장소이므로 yes이면 모든 열이 '읽기'됩니다. off-row storage 등을 고려하면 상황이 복잡 해지고 buffer pool을 생각하면 상황이 정말 진흙이납니다. 그러나 그 세부적인 수준에 대해 질문을 좀 더 자세하게 표현해야합니다 (달성하려는 대상과 질문하는 이유는 무엇입니까?) 그리고 저장 형식을 매우 자세히 이해해야합니다.

부수적으로 SQL Server와 Oracle은 모두 열 지향 방식 (즉, 필요하지 않은 열은 읽지 않음)으로 읽기 위해 명시 적으로 설계된 columnstore 형식을 지원하지만 사용자가 원하는 열만있는 것은 아닙니다. 저장은 매우, 아주 특별한 경우입니다.

2

데이터 페이지의 모든 데이터는 질의되지 않고 바운드 상태로 저장되지 않는 한 읽습니다. varchar (최대) 열이 8k 데이터를 초과하면 새 페이지 집합에서 계속됩니다. 이 페이지는 필드를 쿼리하지 않을 때 읽지 않습니다.

관련 문제