coverd index 0 6 2,596

by ndkeka11 [DB 기타] postgresql [2023.11.01 09:00:36]


only index scan이 covered index와 동일한 개념이던데 버퍼 i/o랑 디스크 i/o가 발생하는 이유가 무엇인가요? 인덱스만 스캔하면은 블록 i/o는 발생하지 않는게 맞지 않나요?

그리고 클러스터로 테이블을 재정렬하고 나서 버퍼 블록 i/o가 확실히 많이 줄은게 보이는데 이게 랜덤 액세스로 스캔하다가 바로 옆에 리프도 같은 블록을 가리키게 되면 시퀀셜 액세스가 유도되는건가요? 버퍼 pinning?이라는게 블록에 접근하고 읽고 바로 풀어버리는게 아니라 그대로 잡고 있다고하던데 그렇게 시퀀셜 액세스가 되는건가요?

by 마농 [2023.11.01 09:16:40]

모든 I/O 는 블럭 단위로 발생이 됩니다.
모든 데이터는 버퍼를 통해 읽게 됩니다.
버퍼에 없으면 디스크에서 읽어서 버퍼로 올립니다.
테이블도, 인덱스도 블럭에 저장되어 있습니다.

블럭 안에는 하나의 레코드만 존재하는게 아닙니다.
정렬순서대로 클러스터링되어 있다면 하나의 블럭를 읽었을 때
원하는 데이터가 몰려 있으므로 효과가 좋습니다.
예를 들어 인덱스 키 1 부터 10 까지 10개를 읽으려고 하는데
이게 하나의 블럭에 몰려 있으면 블럭을 1번만 읽으면 되는데.
그렇지 않고 10개 블럭에 흩어져 있다면? 10개 블럭을 왔다갔다 하면서 읽어야 하는 거죠.


by ndkeka11 [2023.11.01 09:19:04]

매번 좋은 답변 감사합니다. 이해가 되었습니다.

하나 궁금한게 인덱스를 생성하면 인덱스로 선택한 컬럼을 가지고 가면 리프 블록에 컬럼값이 같이 저장되지 않나요?

그렇게 되면 바로 컬럼을 읽어 들이면 끝 아닌가요? only index scan이 테이블 액세스가 발생하지 않는데도 클러스터링 이후 블록 i/o가 줄은 이유는 무엇인가요?


by ndkeka11 [2023.11.01 10:33:28]

감사합니다~!


by 마농 [2023.11.01 09:34:28]

테이블이나 인덱스는 입력, 삭제, 변경 등의 과정을 거치면서 빈공간이 생기게 됩니다.
테이블이나 인덱스를 재생성 하게 되면 빈공간이 줄어들어 공간을 덜 차지하게 됩니다.


by ndkeka11 [2023.11.01 09:42:16]

그러면 클러스터링하는 과정에서 빈공간을 효율있게 바꿔주어 i/o가 줄어드는건가요?


by 마농 [2023.11.01 10:11:24]

원래 빈공간이나, HWM 등으로 인해 공간을 더 많이 차지 하고 있었다면?
재생성하게 되면 이러한 빈공간이 사라지게 되겠지요. 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입