기본적으로 SGA 테이블 스페이스라는 곳에 저장한다.
세그먼트 단위로 나누어서 테이블, 인덱스, 등에 관한 데이터를 묶어서 저장한다.
데이터는 익스텐트 단위로 확장된다.
실제 데이터가 기록될 때는 블록 단위로 저장된다. (오라클 기준 블록, Mysql 기준 페이지)
데이터 파일에 블록이 저장되는데, 한 블록에는 같은 테이블에 대한 정보들이 들어있다.
한 테이블에 대한 정보를 담은 블록은 데이터 파일에 분산되어 저장된다.
(테이블 엑세스 시에 파일 경합이 벌어지는 것을 줄이기 위해서 그렇다.)
따라서 같은 데이터 파일에 저장되었다고 해서 같은 테이블에 대한 정보가 저장되었다고 볼 수는 없다.
sql 의 성능을 끌어올리는 것은 I/O 작업을 줄이는 것에 목표가 있는데,
물리적 I/O 보다도 논리적 I/O 를 줄이는 것이 초점이며 db 버퍼 캐시에 접근해서 발생한 I/O 를 의미한다.
db 버퍼 캐시는 사용자가 입력한 데이터에 대해 캐싱된 정보가 들어있다.
논리적 I/O 를 최적화하기 위해서는 결국 필요한 정보만 가져오려는 코드가 작성되는게 중요하다.
인덱스를 적절히 활용해서 필요한 부분만 스캔하도록, 조인 대신 서브쿼리를 사용하도록, * 대신 필요한 칼럼만 조회하도록, 바인딩 파라미터를 이용해서 동일한 쿼리에 대해 프로시저를 재사용하도록 하는 시도를 통해,
논리적 I/O 를 최적화할 수 있다.
참고하면 좋은 사이트:
'개발 > TIL' 카테고리의 다른 글
[SQL] 인덱스 기본 구조 (0) | 2025.03.09 |
---|---|
[SQL] 복합인덱스를 사용할 때 주의할 점 (0) | 2025.03.07 |
[SQL] spring JPA 에서 자주 등장하는 ':1' 은? (feat 파라미터 바인딩) (0) | 2025.03.06 |
java에서 비동기 처리하기 Mono와 Flux ( reactor.core 라이브러리) (7) | 2025.03.04 |
[SQL 튜닝] SQL 처리과정과 IO (1) | 2025.03.03 |