본문 바로가기
데이터베이스 INDEX

Sequence access vs Random access

by 홍보살 2025. 2. 11.

오늘은 DBMS에서 데이터에 접근하는 기본 개념에 대해서 얘기해 보자

이미 인덱스 첫번째에서 다룬 내용과 중첩되는 부분이 있을 것이다.

우선 Sequence access 라는 것은 말 그대로 순차적으로 데이터를 읽어 들이는 방식이고 

오라클과 달리 MS-SQL에서는 명확하게 seek와 구분하여 Scan이라고 명명한다.

 

보통 OLTP 에서 기준정보 테이블이 아닌 raw data형 테이블이라면 억건이 넘어가는 경우는 흔한 일이다.

아무리 서버의 성능이 좋다해도 처음부터 다 읽어가는 과정에서 빠른 속도를 기대하기란 쉽지 않다.

그럼에도 불구하고 간혹 random access 보다 빠른 경우가 존재한다.

Sequence access 는 이처럼 모호하거나 중의적 의미없이 명확하다.

 

반대로 Random access는 무엇인가?

역시나 오라클과 다르게 MS-SQL에서는 Seek 와 look up으로 표현된다.

문제는 random이라는 단어 때문 혼돈이 되곤하는데 영문의 대표적인 의미인 무작위(규칙없는)로 검색하는 것이 아니다,

어원을 쫒아가보면 "randir : 빠르게 달리다" 라는 의미가 있다.

해서 randir 로 검색해 보면 대부분 신발 브랜드로 소비되고 있는 것을 확인할 수 있다.

Random access 라는 컴퓨터 용어는 1953년에 등록되었고,

DBMS 넓게는 IT바닥에서 Random access 란 "무작위 규칙없는 데이터 읽기"가 아닌 "순차적이지 않은 빠른 읽기 방식" 으로 이해하는게 맞겠다.

 

이미 서술한 이전 인덱스 강좌를 우선 참조하는게 좋겠다.-->>   https://hongbosal.tistory.com/31

그럼에도 간단하게 위의 강좌의 골자만 설명한다면

Random access 란 정렬된 테이블에서 root -> branch -> page 이 과정에서 가장 중요한건 branch 에 기록된 정렬상태의 키워드를 이용한 등호와 부등호로 해당 데이터가 존재하는 page를 찾는 것이다.

이때 원하는 데이터가 하나의 페이지에 모여있는지 다수의 page에 존재하는지도 속도(래치와 군집도의 영향)에 중요한 영향을 미치기도 한다.

이 모든 과정을 MS-SQL plan 에서는 seek라고 한다.

 

문제는 해당 정렬 상태의 테이블이 cluster가 아니며 출력 혹은 조건 컬럼을 모두 포함하지 않는 경우다.

이때 옵티마이저가 cluster 에  진행하는 후속조치가 lookup 이다.

예전에는 bookmark lookup으로 불리었고 근래의 경우 PK가 존재할시에는 key lookup을(pk 컬럼값을 기준으로 찾아가는 방식) cluster형 PK가 없을시(heap 테이블)에는 RID lookup이라 부른다.(오라클의 rowid 값을 찾아가는 방식으로 이해)

MS에서는 가급적 Key lookup을 권장(cluster형 index를 만들라는 얘기)하나 경험상 그때그때 다른 것 같다.

 

정리해서 lookup 이란 nonclustered index에서 원하는 조건에 만족하는 row를 찾았으나 출력 혹은 조건 컬럼 중 누락된 경우 누락된 컬럼이 모두 존재하는 테이블 혹은 인덱스에서 lookup을 추가로 진행 해야 라는 것을 말한다.

(대부분 데이터 테이블을 대상으로 한다.)

 

고민은 여기서 부터다.

상식적으로 처음부터 주욱~~~ 읽어가는 Sequence access 가 왓다리 갓다리 비교하면서 찾는 Random access 보다는 빠르다.

상식을 넘어서 실전에서  Sequence access는 Random access 에 비해 I/O 비용은 크고 CPU 비용은 상황에 따라 resource가 적을 수 있다.(간혹 full scan을 강제하는 힌트(index(0)) 로  Sequence access 를 사용하기도 하는 이유이기도 하다.)

 

그럼에도 불구하고 실전에서는 만날 인덱스 타령만 한다. ㅠㅠ

"인덱스만 빵빵하는 속도 문제 쯤이야 ~~"... 라고 그들은 항변하지만,

10년 넘게 튜너활동을 한 내가 보기엔 "에이~~~"  인 경우가 대부분이며 튜닝 프로젝트시 역으로 기존 인덱스의 삭제 혹은 통합작업을 하는 경우도 적지않다.

※ 용어정리
카디널리티(Cardinality)는 특정 테이블내 특정 컬럼 데이터의 유니크(Unique)한 개수이다.
요리 표현하면 이해가 빠를 것 같다.
SELECT COUNT(DISTINCT 대상컬럼) FROM 대상테이블
카디널리티가 중요한 이유는 인덱스 생성시 다시 다룰것이고 이번에 용어만 이해하자.

선택도(Selectivity)는 아래와 같이 도식화할 수 있다.
Selectivity = 대상컬럼의 Cardinality / 대상테이블의 ROW COUNT
예컨데 단일컬럼으로 하는 테이블에서 해당 KEY 컬럼의 선택도는 1이 되는 것이다.
역시나 상세한 것은 별도로 다룰것이다.

 

위에서 언급한 카디널리티와 선택도 그리고 여기에  부합하는 조건 컬럼에 의한 필터링되어 출력된 row count와 lookup 과정의 비용에 따라서 옵티마이저는 Sequence access 와 Random access 중 선택을 하게 된다. 

단순히 lookup의 과정을 삭제하기 위해 결과 출력 컬럼과 조건 컬럼 모두를 index내에 포함하는 covered index 의 생성은 다수의 경우 trade-off를 무시한 경우가 많다.

 

※ 용어정리 (위키)
Trade-off(상충 관계)는 다른 측면에서 이득을 얻으면서 집합 또는 디자인의 품질, 양, 속성을 없애거나 잃어버리는 일이 수반되는 상황적 결정이다.
즉 하나가 증가하면 다른 하나는 무조건 감소한다는 것을 뜻.

DBMS에서 INDEX 란 인간사의 명암이 공존하듯 항상 trade-off 라는 생각으로 접근해야 한다.

 

 

이 글은 이비니어스( www.evinious.co.kr )의 소유이며 불펌은 허락하지 않습니다.

 

 

 

 

'데이터베이스 INDEX' 카테고리의 다른 글

INDEX 1. INDEX는 정렬(Sort)이다.  (1) 2025.01.21