Skip to content

『오라클 SQL 파워업』 — 데이터 모델·배경 개념 (참고 읽을거리) ​

🛠 실제 설치, 적재, 실습 절차는 README.md를 따른다(전용 계정 pup, 18테이블, CF01~CF18 ctl, load_all.sh, 대용량 CF10/CF11 실습 메뉴 포함). 이 문서는 테이블 18개의 의미와 도메인 배경을 설명하는 개념 자료다.

drive-download-...zip을 분석한 결과와 적재 절차를 정리했다. zip 구성: (DDL)오라클SQL파워업_…sql(테이블 18개) · (SQL)오라클SQL파워업_…sql(연습쿼리 167개) · (DATA)CSV_…zip(CF01~CF18.csv).


1. 이 환경이 만드는 것 — 유통 도메인 18테이블 ​

테이블의미비고
CF01상품PK: ITM_NO
CF02카테고리
CF03상품원재료PK: ITM_NO, MTRL_ITM_NO
CF04상품옵션
CF05상품가격PK: ITM_NO, UPRC_KN_CD, APL_DT
CF06거래처
CF07매장
CF08부서
CF09사원
CF10판매약 50만 건(대용량)
CF11판매상품약 110만 건(대용량)
CF12발주
CF13발주상품
CF14입출고
CF15입출고상품
CF16공통코드PK: CLS_CD, CD
CF17재고집계
CF18일별상품재고집계PK: SHP_NO, ITM_NO, INV_BS_DT

CF10과 CF11 덕분에 대용량 조인, 인덱스, 집계 튜닝을 제대로 실습할 수 있다. 함께 들어 있는 연습 쿼리 167개((SQL)…sql)가 그대로 실습 문제가 된다.


2. ⚠️ 중요 — CSV 인코딩은 CP949(MS949) ​

CSV의 한글은 CP949(=KO16MSWIN949 / MS949)다. UTF-8로 적재하면 한글이 깨진다(예: 아이스티 → ���̽�Ƽ). 적재할 때는 반드시 캐릭터셋을 MS949/CP949로 지정해야 한다. 아니면 미리 UTF-8로 변환해 둔다.

그 밖에 주의할 점:

  • CSV 첫 줄은 헤더(컬럼명)라서 적재할 때 1행을 건너뛴다(skip).
  • 따옴표가 있는 파일과 없는 파일이 섞여 있다(대부분 "..."). 구분자는 콤마다.
  • 날짜 포맷이 컬럼과 파일마다 다르다: 22/03/26 00:00:00, 20220101, 2022-04-02, 22/04/02 등. 적재할 때 포맷 마스크를 지정하거나 마법사의 자동 인식을 쓴다.

3. 적재 절차 ​

STEP 1. 실습 유저 준비 ​

00_환경구축의 sqlp 계정을 그대로 쓰거나 전용 유저를 만든다.

sql
ALTER SESSION SET CONTAINER = FREEPDB1;
CREATE USER pup IDENTIFIED BY pup DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;
GRANT CONNECT, RESOURCE, CREATE VIEW, UNLIMITED TABLESPACE TO pup;
GRANT SELECT_CATALOG_ROLE, ALTER SESSION TO pup;

STEP 2. 테이블 생성 — DDL 실행 ​

(DDL)오라클SQL파워업_…sql을 위 유저로 실행하면 테이블 18개와 PK가 생긴다.

대용량 테이블(CF10/CF11)은 PK와 인덱스를 적재한 뒤에 만들어야 적재가 빠르다. DDL이 PK를 먼저 만든다면 그대로 둬도 되지만, 느리면 CF10/CF11의 PK를 DISABLE한 뒤 적재하고 다시 ENABLE한다.

STEP 3. CSV 적재 — 방법 택1 ​

방법 ① SQL Developer "데이터 임포트" 마법사 (권장·가장 쉬움) ​

  1. 좌측 접속에서 대상 테이블(예: CF01) 우클릭 → 데이터 임포트(Import Data).
  2. 파일 선택 → 인코딩을 MS949(또는 CP949)로 지정한다. 머리글 포함에 체크한다.
  3. 열 매핑에서 날짜 컬럼 포맷을 확인한다(자동 인식). → 완료.
  4. CF01~CF18을 반복한다. CF10과 CF11은 용량이 크니 마법사보다 ②(SQL*Loader)가 빠르다.

방법 ② SQL*Loader (대용량·일괄, 빠름) ​

같은 폴더의 예제 CF01_sqlldr_예제.ctl 파일을 참고한다. 핵심은 CHARACTERSET KO16MSWIN949다.

bash
# (컨테이너/서버에 CSV와 .ctl을 두고)
sqlldr pup/pup@localhost:1521/FREEPDB1 control=CF01.ctl log=CF01.log direct=true
  • 대용량 CF10/CF11은 direct=true(다이렉트 패스)로 빠르게 적재한다.
  • 테이블마다 DDL과 CSV 헤더의 컬럼 순서가 같으므로, 예제 .ctl의 컬럼 부분만 테이블에 맞게 바꾸면 된다.

방법 ③ 외부 테이블(External Table) ​

CSV를 디렉터리 객체로 등록해 ORGANIZATION EXTERNAL로 읽고 INSERT SELECT로 넣는다. 반복 적재에 유리하다.

STEP 4. 통계 수집 (필수) ​

sql
EXEC DBMS_STATS.GATHER_SCHEMA_STATS(USER, cascade=>TRUE);

STEP 5. 적재 검증 ​

sql
SELECT 'CF10' t, COUNT(*) c FROM cf10        -- 기대 ~500,000
UNION ALL SELECT 'CF11', COUNT(*) FROM cf11   -- 기대 ~1,096,709
UNION ALL SELECT 'CF01', COUNT(*) FROM cf01;
-- 한글 확인 (깨지면 인코딩 재적재)
SELECT itm_no, itm_nm FROM cf01 WHERE ROWNUM <= 5;

4. 이 환경으로 무엇을 하나 ​

  • (SQL)…sql의 쿼리 167개를 1번부터 실행하며 결과와 실행계획을 확인한다. 실전 SQL 작성과 튜닝 훈련이 된다.
  • CF10(판매)×CF11(판매상품)의 대용량 조인으로 NL vs Hash, 부분범위 처리, 집계 튜닝을 실습한다(5·6주차).
  • 이 커리큘럼의 10_추가연습문제에 있는 실습 SQL 문제 일부도 이 스키마를 쓴다.

CP949 변환이 번거로우면 터미널에서 한 번에 UTF-8로 바꿔 적재해도 된다. iconv -f CP949 -t UTF-8 CF01.csv > CF01_utf8.csv(이 경우 적재 캐릭터셋은 AL32UTF8이다).