테마
『오라클 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 "데이터 임포트" 마법사 (권장·가장 쉬움)
- 좌측 접속에서 대상 테이블(예:
CF01) 우클릭 → 데이터 임포트(Import Data). - 파일 선택 → 인코딩을
MS949(또는CP949)로 지정한다. 머리글 포함에 체크한다. - 열 매핑에서 날짜 컬럼 포맷을 확인한다(자동 인식). → 완료.
- 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이다).