서버 개발/프로그래머를 위한 RDBMS

부분범위 처리와 전체 범위처리

지노윈 2020. 5. 27. 10:05
반응형

user 테이블이 있는데 1000만건입니다.

select * from [user] 를 실행하면 언제 부터 결과를 받을 수 있나요?

읽는 데이터 모두가 답입니다. 데이터베이스는 운반 단위에 차면 바로 바로 응답합니다. 그래서 0.0001초 만에 결과를 받기 시작합니다.

이 것이 바로 부분 범위 처리 입니다.

 

select * from [user] order by name를 실행하면 언제 부터 결과를 받을 수 있나요?

이것은 전체를 읽어서 name로 소트를 해야만 결과를 받을 수 있습니다.

이 것이 바로 전체 범위 처리입니다.

 

  • 전체 범위 처리 : 풀 스캔 후 가공하여 Array Size(운반 단위) 만큼 추출되어야 결과를 얻음
  • 부분 범위 처리 : 조건을 만족하는 Row 수가 Array Size에 도달되면 결과를 얻음

 

select empno, sal*12 from emp

: 부분 범위 처리

select dectno, sum(sal) from emp group by deptno

: 전체 범위 처리

 

대용량 데이터베이스 솔루션 1권에서 가져왔습니다

부분 범위 처리의 예들입니다.

총알 택시의 예)

대용량 데이터베이스솔루션 1권에서 가지고 왔습니다.

총알 택시는 목적지가 같은 손님 4명을 모두 태워야 출발합니다. 즉, 운송 단위를 채워야 출발합니다.

 

게임 개발에서 컨텐트 개발에서 실시간으로 처리 되는 것은 일부 예외를 제외하고 대부분 부분 범위 처리로 작업이 되어야 합니다.

이 외에 서버 구동이나 로그 분석이나 게임 통계 등의 처리에서는 전체 범위 처리로 작업 되는 것이 더 좋을 경우가 많습니다.

 

실제 예)

select * from [user] where name like '해%' 

이 것은 전체 범위 처리일까요? 부분 범위 처리일까요?

1억명 중에 딱 두 명 있다면 얼마나 걸리까요?

굉장히 오래 있다가 딱 2명을 튀어나옵니다.

이유는 결과가 운반 단위를 모두 채우지 못했기 때문에 모든 테이블을 끝까지 읽은 다음에야 결과가 나옵니다.

이것이 총알 택시와 같은 원리 입니다.

부분 범위 치리라고 모두 빠른 것이 아니며 원리를 알고 속도를 향상 시켜야 겠습니다.

 

DBMS는 내가 원하는 답을 모두 읽지 않았더라도 운반 단위만 차면 읽어 옵니다.

0.01초 만에 나오게 하는 방법이 있습니다. 그 방법이 무엇일까요? 이것이 바로 인덱스 입니다.

 

부분 범위로 처리로의 유도

  • Index를 활용하여 Sort를 대체
    인덱스를 사용하여 소트가 되면서 부분 범위 처리를 합니다. 테이블 데이터를 random access를 하는 단점이 있습니다.
-- 전체 범위 처리
select * from [user]
where reg_date between '2020-04-09' and '2020-04-10'
order by reg_date
-- 부분 범위 처리
select * from [user]
with(index(idx_reg_date))
where reg_date between '2020-04-09' and '2020-04-10'

 

  • Max 처리
-- 전체 범위 처리
select max(reg_date) from [user]
-- 부분 범위 처리
select top 1 reg_date
from [user] with(index(idx_reg_date))

전체 범위 처리는 전체를 처리하여 레포팅 하는 것에 적합하고 부분 범위 처리는 온라인으로 결과를 출력할때 즉, 반응이 빨라야 할때 사용하는 방법입니다.

부분 범위 처리가 전체 범위 처리 보다 시간이 더 오래 걸릴 수도 있으므로 용도에 맞게 써야 합니다.

 

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 게임 서버 프로그래머가 알아야 할 RDBMS

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 옵티마이저 맛보기

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 테이블 조인 하면 느리다?

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 리커시브 모델의 활용

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 아크 모델(exclusive or)에서의 주의점

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 부분범위 처리와 전체 범위처리

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 인덱스의 제대 사용하자

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - DB 옵티마이저

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - Nested Loop/Sort Merge/Hash Join

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - DB 테이블 클러스터링 팩터

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - DB 절차적 사고 VS 집합적 사고

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - SQL 집합의 가공

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - SQL IN의 특징과 IN의 활용

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 서브 쿼리 활용

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 인라인 뷰의 활용