■서론
ㅎㅇ 여기 애들한테
실질적으로 도움이 될만한게 뭐가 있을까
생각해봤는데 하나라도 자세히
올려주면 좋다고 생각해서씀
※mssql기준으로 설명함 아마용어만 다를듯※

■개요
RDBMS에서 데이터를 읽는 3가지 연산중 scan에
원리에 대해서 설명을 해볼꺼임

RDBMS는 scan, seek, lookup 이3가지 연산과 힙, 클러스터드인덱스, 논클러스터드 인덱스 내에서 여러 조합을 통해
데이터를 엑세스하는 패턴을 가지고 있어
이는 그것을 이해하기 위한 기반지식이 될것이고
더 나아가 실무를 하면서 비즈니스 로직이
테이블에 대해 적합한 연산을 하는지 자가진단
할 수 있기를 바래

■본문
일단 스캔 그자체를 설명하자면 어떠한 범위에 대해
쭉이어서 읽어나가는걸 스캔이라고 해

이러한 방식을 지원할 수 있는 이유는
테이블 또는 인덱스에 대한 페이지 할당 정보를 저장하는
맵이 내부에 있는것 과 인덱스의 구조의 경우
동일레벨의 노드간 링크드 리스트로 연결되어 있으며
인덱스키의 정렬 순으로 페이지가 배치되기 때문이야

눈치가 좋은 친구는 여기서
위에 설명한 두가지로 스캔방식이
나뉨을 알 수 있었을 꺼야
스캔은 두가지 방식을 지원하는데

하나는 아까 설명한 페이지 할당맵 을 쭉 읽어나가는 것이고
두번째는 인덱스의 리프노드를 정렬순으로 쭉 읽어나가는 거야

이러한 두가지 방식에는 각자 장단점이 있는데
★페이지 할당 맵 scan의경우
□장점
- 페이지 할당맵은 페이지에 저장된 데이터가 물리적으로
연속되는 경향(100%보장 x)이 있기 때문에 이를 통해
미리 읽기를 위해 필요한 물리적 읽기량이 대폭 감소해
- 따라서 위 장점에 기반하여 인덱스의 페이지가 조각화(물리적 페이지 순서와 논리적 페이지 순서 불일치)된
정도에 따라서 페이지 할당맵 scan이 유리해
(페이지 조각화 정도에따라 10배차이 날 수 있다고함)

□단점
- 페이지를 할당한 순서대로 스캔할수 밖에 없기 때문에
결과셋을 원하는 바로 정렬할 수 없어
- NoLock이나 Tablock힌트가 지정된경우에만 사용할 수 있기 때문에 부정확한 결과여도 상관없거나 스캔도중 데이터가 변경되지 않게 하여 정호가한 결과를 보장할 수 있도록
할 수 있는경우에만 사용가능해

★인덱스 리프페이지 스캔의 경우
□장점
- 인덱스 키를 기반으로한 결과셋의 정렬순서를 보장할 수 있다.

□단점
- 페이지 할당맵 scan의 장점과 동일하다 물리적 읽기에서
페이지 조각화에 영향을 받음
- 논리적 읽기에서 1io손해봄 ㅋㅋ 인덱스 리프페이지 스캔은 지정된 범위까지 읽었는지 확인하기위해 범위끝에 바로 다음
페이지를 하나 읽음(벤더마다를수도 있을것 같은점이야)

■결론
scan의 동작원리에 대해서 설명해봤는데
결론을 지어보자면

페이지 조각화 정도에따라 데이터가 캐시되지 않았을때
유리한 scan연산이 다르지만 조각화가 거의 없는경우
성능이 비슷하고 데이터가 이미 캐시되었다면 조각화에
따른 두scan간 성능 차이가 발생하지 않기때문에

거의 대부분에 환경에서는 페이지 조각화 정도에 신경쓰면서
인덱스 리프노드 스캔만 고려하면 될것 같아.

■+ Scan 성능을 향상 시키는법
기본적으로 Scan연산은 연결된 페이지를 한 방향으로 쭉 읽기 때문에 나중에 설명할 seek이나 lookup연산 처럼 인덱스 트리
depth의 영향을 받지 않아 scan의 성능을 향상 시키는 방법
으로는
- 스키마 설계시 속성별 데이터 크기를 타이트 하게 설계하여
페이지당 저장되는 레코드 수를 늘리기
- 대용량 테이블의 경우 파티셔닝을 파티션마다 비슷한 행수를 가지도록 구현하고 이를 디스크별로 파티션을 할당한뒤
패러렐 연산으로 파티션마다 patial scan하게 만들기
- 더있을꺼같은데 생각안남

■비고


- dc official App