SQL

Oracle, postgreSQL 비교

class="song" 2026. 11. 1.

1.메모리 아키텍처와 I/O 처리 (Double Buffering)

Oracle(Direct I/O 기반) :

    SGA라는 메모리 공간을 할당하여 통제,

    디스크에서 데이터를 읽고 쓸 때 OS의 파일 시스템 캐시를 우회하여 오라클 엔진이 메모리를 100% 독점하고 직접 관리함

 

postgreSQL(OS Page Cache 의존):

    자체 버퍼 캐시인 shared_buffers를 가지지만, 오라클처럼 메모리를 독점하지 않음,

     데이터를 읽고 쓸 때 OS의 페이지 캐시를 한 번 더 거치는 더블 버퍼링 구조를 갖음

     shared_buffers를 전체 RAM의 25% 수준으로만 작게 잡고,

     나머지 메모리를 OS가 파일 시스템 캐시용으로 쓰도록 내버려 두는 것이 공식 권장사항

 


2. 옵티마이저 패러다임과 힌트의 부재

Oracle(Hint 중심 튜닝):

     힌트를 강력하게 지원함
     옵티마이저가 엉뚱한 실행계획을 세우면 DBA가 힌트를 강제하여 빠르고 직관적으로 튜닝 가능


PostgreSQL(통계 및 파라미터 중심 튜닝):

     철학적으로 옵티마이저 힌트를 네이티브로 지원하지 않음(필요시 pg_hint_plan 이라는 확장 모듈을 별도로 설치)
     힌트에 의존하기 보다 통계 정보를 최신화하고, 쿼리를 논리적으로 재작성하거나
     random_page_cost, seq_page_cost, work_mem 같은 엔진 파라미터를 조절해 옵티마이저가 올바른 비용을 계산하도록 유도

 


3. NULL과 빈 문자열(Empty String)

Oracle: 길이가 0인 빈 문자열 ``을 NULL과 동일하게 취급


PostgreSQL: 

      빈 문자열과 NULL을 다른 값으로 엄격하게 구분
      오라클에서 정상 조회되던 데이터가 마이그레이션 시 조회가 안되는 오류 발생 가능

 


 

4. 인덱스의 NULL 포함 여부

Oracle:

    B-TREE 인덱스 생성 시 인덱스 컬럼의 값이 모두 NULL 인 행은 인덱스 트리에 저장하지 않음

 

PostgreSQL:

    NULL 값도 B-TREE 인덱스에 포함하여 저장

 


5. 트랜잭션 로그 관리(Redo VS WAL)

Oracle(Redo Log): 

     관리자가 지정한 크기와 개수의 Redo Log 파일(그룹)을 순환하며 덮어쓰는 구조, 
     덮어쓰기 전에 아카이브로 빼냄

 

PostgreSQL(WAL - Write Ahead Log):

     순환 구조가 아니라, 기본 16MB 크기의 WAL 세그먼트 파일들을 계속 생성해서 관리

 


6. 스키마(Schema)와 계정(User/Role)의 종속성

Oracle:

      유저(User)가 곧 스키마(Schema)
      계정을 생성하면 그 계정 이름과 동일한 스키마가 1:1로 생성

 

PostgreSQL:

      롤(Role/User)과 스키마(Schema)가 완전히 분리되어 있음
      롤은 DB 클러스터 전체에 생성되는 접속 및 권한의 주체일 뿐이며,
      특정 Database 안에 여러 개의 Schema(논리적 폴더)를 자유롭게 만들고,

      하나의 롤이 여러 스키마의 소유권을 가질 수 있는 구조

 

댓글