[친절한 SQL 튜닝] 1장 SQL 처리 과정과 I/O 🔩 (2)

뉴우비(newwwbi)·2023년 1월 18일
0

친절한 SQL 튜닝

목록 보기
2/2
post-thumbnail

아래의 내용은 조시형의 <친절한 SQL 튜닝> 책을 공부하며 중요한 내용을 정리한 것입니다.

1.3 데이터 저장 구조 및 I/O 메커니즘

SQL이 느린 이유

SQL이 느린 이유는 십중팔구 I/O 때문이다.
예전에 비해 스토리지 성능이 많이 향상되었지만, I/O 속도는 여전히 우리 기대에 못 미친다.
SSD를 사용한 최신 스토리지에서도 블록 한개를 읽는데 약 1~2ms가 걸린다. 즉 초당 500~1,000 블록 밖에 읽지 못 한다.
만약에 어떤 SQL이 Single Block I/O 방식으로 10,000 블록을 읽는다면, SSD를 사용한 최신 스토리지에서도 실행하는데 10초 이상 걸리게 된다.
디스크 I/O가 SQL 성능을 좌우한다고 해도 과언이 아니다.

데이터베이스 저장 구조

데이터베이스는 여러 개의 테이블스페이스로 구성되어 있고, 테이블스페이스는 다시 여러 개의 세그먼트, 세그먼트는 여러 개의 익스텐트, 익스텐트는 여러 개의 블록으로 구성되어 있다.

테이블스페이스(tablespace)
테이블스페이스는 한 개 이상의 데이터파일로 구성된 논리적 집합으로, 세그먼트를 담는 컨테이너이다.
테이블, 인덱스 같은 논리적인 저장 공간과 디스크, 데이터파일 같은 물리적인 저장 공간을 연결시키는 추상 계층 역할을 한다.

세그먼트(segment)
세그먼트는 테이블이나 인덱스처럼 물리적 저장 공간을 필요로하는 오브젝트이다.
파티션 구조가 아니라면 테이블과 인덱스 모두 하나의 세그먼트이다.
테이블과 인덱스가 파티션 구조라면, 각 파티션이 하나의 세그먼트이다.

익스텐트(extent)
익스텐트는 테이블스페이스 내에 연속된 블록 집합이다.
세그먼트가 커지면서 저장 공간이 부족해질 때마다 익스텐트 단위로 공간을 할당받는다.
세그먼트에 할당된 익스텐트끼리는 항상 연속된 공간에 위치하지 않고, 심지어 다른 데이터파일에 위치할 수 있다.

블록(block)
레코드가 실제로 저장되는 공간이다.
블록에는 여러 개의 로우가 들어있을 수 있다.
MySQL innodb 엔진에서 디폴트 블록 사이즈는 16KB이다.

블록 단위 I/O

DBMS는 블록 단위로 데이터를 읽고 쓴다.
그래서 레코드 한 개를 읽을 때도 해당 레코드가 저장된 블록을 통째로 읽는다.
테이블뿐만 아니라 인덱스도 블록 단위로 데이터를 읽고 쓴다.

시퀀셜 액세스 VS 랜덤 액세스

테이블 또는 인덱스 블록을 액세스하는 방법에는 시퀀셜 액세스와 랜덤 액세스 두가지가 있다.
시퀀셜 액세스는 물리적 또는 논리적으로 연결된 순서대로 블록을 액세스하는 방식이다.
랜덤 액세스는 그 반대로 물리적 또는 논리적으로 연결된 순서에 상관없이, 레코드 하나를 읽기 위해서 블록 하나씩 읽는 방식이다.
랜덤 액세스가 무조건 더 효율적일거 같지만, 조건에 따라서는 시퀀셜 액세스가 더 효율적일 수 있다.
(자세한건 2장에서 정리한다)

논리적 I/O VS 물리적 I/O

참고 자료

https://en.wikipedia.org/wiki/Tablespace

profile
배운 지식을 다른 사람과 공유하고 싶습니다

0개의 댓글