테마
📌 『튜너의 1년』 독자는 먼저
../README.md(고객사 카드)를 본다. 이 문서는 컨테이너를 하나만 쓰던 시절에 썼다. 컨테이너oracle-free는ora-newshop으로 바꿔 읽는다. 12화에 필요한 것은 1~4장(ORA_SQL_TEST+ FK 7개)까지다. 쓰는 화: 12.
『SQL BOOSTER』 책 원본 SQL — 챕터별 따라 치며 환경구축 & 실습 (계정 ORA_SQL_TEST)
『SQL BOOSTER』(유일환)의 책 원본 SQL 파일을 챕터(C1~C11) 순서대로 직접 실행하면서 환경을 만들고 실습한다. 튜닝 에센셜이나 SQL 파워업처럼 "한 줄씩 따라 치는" 방식이다. 일반판(루트, 전통 조인)과 ANSI판(
ANSI_/, ANSI 조인)이 함께 있다. 둘 중 하나만 고른다. 계정:ORA_SQL_TEST/1qaz2wsx(책 기준). ★C6의 통계 명령에 이 스키마명이 하드코딩되어 있으므로 계정명을 바꾸면 안 된다.
📌 이미 있는 SQL BOOSTER 자료와의 관계:
1_시험준비_SQLP합격/11_SQLBOOSTER_정리/*(공개 사이트에는 없음)*는 책 정리 노트 + 축소판 스키마다(계정sqlp,T_ORD_BIG100만 건을 한 번에 생성하며, Hero가 쓰는 "스키마 B"). 이 폴더는 그와 별개로 책 원본 SQL을 챕터별로 그대로 돌려 보는 곳이다(계정ORA_SQL_TEST). 둘은 계정이 달라서 함께 쓸 수 있다. 전체 데이터셋 지도는 종합안내에 있다.
0. 폴더 구성
SQL_BOOSTER/
├── README.md ← (이 문서)
├── C1_01_DB사용자생성.sql ← [환경구축①] 사용자·권한 (SYS로) ※책 원본은 E:\ 경로 → 아래 적응판 사용
├── C1_02_테이블생성.sql ← [환경구축②] 9개 테이블 + FK (ORA_SQL_TEST로)
├── C1_03_데이터생성.sql ← [환경구축③] 기준데이터 생성 (CONNECT BY, 한글 코드명 → UTF-8)
├── C2_GROUPBY_ROLLUP.sql ┐
├── C3_JOIN.sql │
├── C4_유용한SQL문법.sql │ [챕터 실습] 책 PART별 예제 SQL.
├── C5_성능기본지식.sql │ · C6 → T_ORD_BIG(대용량) 생성
├── C6_INDEX.sql │ · C7 → T_ORD_JOIN + 인덱스들 생성
├── C7_JOIN과성능.sql │ · C8 → OLTP용 M_ACC/T_PO 등 생성
├── C8_OLTP_SQL기술.sql │ (따라가며 객체가 추가됨)
├── C9_분석함수.sql │
├── C10_페이징처리.sql │
├── C11_SQL개발가이드.sql ┘
└── ANSI_/ ← 위와 동일하나 조인을 ANSI 문법으로. + C_BAS_CD_INSERT.sql챕터 매핑(책 11장): C1 준비 · C2 GROUP BY/ROLLUP · C3 JOIN · C4 유용한 문법 · C5 성능기본 · C6 INDEX · C7 JOIN과 성능 · C8 OLTP · C9 분석함수 · C10 페이징 · C11 개발가이드. (8주/과목 매핑은 11_SQLBOOSTER_정리 개요 *(공개 사이트에는 없음)*에 있다.)
⚠️ 시작 전 2가지
- 인코딩 = UTF-8: 파일에 한글 코드명(예:
한국어,가전제품,완료)이 들어 있다. UTF-8 클라이언트로 실행해야 깨지지 않는다(SQLcl도 기본 UTF-8, SQL Developer도 기본 UTF-8).docker exec -i ... < 파일방식도 된다. - C1_01 원본은 그대로 실행하면 안 된다: 책 원본은
E:\ORA_SQL_TEST...10G테이블스페이스와 XE TEMP 경로를 만든다(우리 컨테이너에는 없는 경로다). 아래 1단계 적응판을 쓴다.
1. 환경구축① — 사용자 생성 (SYS로, 적응판)
데이터가 적어서 별도 테이블스페이스 없이 기본 USERS 테이블스페이스를 쓴다. PowerShell에서 접속한다.
powershell
docker exec -it oracle-free sqlplus sys/oracle as sysdbaSQL>에서 다음을 붙여 넣는다.
sql
ALTER SESSION SET CONTAINER = FREEPDB1;
CREATE USER ORA_SQL_TEST IDENTIFIED BY "1qaz2wsx" DEFAULT TABLESPACE USERS QUOTA UNLIMITED ON USERS;
ALTER USER ORA_SQL_TEST ACCOUNT UNLOCK;
GRANT CONNECT, RESOURCE, CREATE VIEW, UNLIMITED TABLESPACE TO ORA_SQL_TEST;
-- 책이 요구하는 측정/통계 권한 (책의 개별 V$ GRANT 대신 롤로 한 번에)
GRANT SELECT_CATALOG_ROLE, SELECT ANY DICTIONARY, ALTER SESSION TO ORA_SQL_TEST;
GRANT EXECUTE ON DBMS_STATS TO ORA_SQL_TEST;
GRANT ALTER SYSTEM TO ORA_SQL_TEST; -- 성능 장의 ALTER SYSTEM FLUSH BUFFER_CACHE 용
EXIT책 원본
C1_01_DB사용자생성.sql은 참고용으로 두고, 계정은 위 적응판으로 만든다. 테이블스페이스와 TEMP RESIZE 줄은 우리 환경에서는 필요 없다.
2. 환경구축② — 테이블 9개 + FK (ORA_SQL_TEST로)
powershell
docker exec -i oracle-free sqlplus ORA_SQL_TEST/1qaz2wsx@localhost:1521/FREEPDB1 < "C1_02_테이블생성.sql"(또는 SQL Developer에서 ORA_SQL_TEST로 접속한 뒤 파일을 열어 실행한다.)
- 생성:
C_BAS_CD·C_BAS_CD_DV(공통코드) /M_ITM·M_ITM_PRC_HIS·M_RGN·M_CUS(마스터) /T_ITM_EVL·T_ORD·T_ORD_DET(트랜잭션) + PK 9개 + FK 7개. - ★ 이 책 스키마에는 FK가 실제로 걸려 있다. 인덱스 없는 FK와 참조 무결성을 실습할 수 있다는 점이 축소판이나 PUP과 다르다.
3. 환경구축③ — 기준데이터 생성
powershell
docker exec -i oracle-free sqlplus ORA_SQL_TEST/1qaz2wsx@localhost:1521/FREEPDB1 < "C1_03_데이터생성.sql"⚠️ 『튜너의 1년』 독자는 이 블록 대신 L4 카드의 명령을 쓴다. 이대로 흘려 넣으면
C_BAS_CD(공통코드)가 오류 없이 0행이 된다. 원본INSERT문 중간의 공백 줄에서 SQL*Plus가 문장을 버리기 때문이다. 카드의 명령은 앞에SET SQLBLANKLINES ON을 붙인다. 그리고 PowerShell에서는<리다이렉션을 쓸 수 없다.
- CONNECT BY로 소량 생성: 상품 100·지역 5·고객 90·주문 3,047·주문상세 3,224·평가 345 + 공통코드 15(한글명).
- ⚠️ 한글이
???로 들어가면 UTF-8 문제다. SQL Developer(UTF-8)에서 파일을 열어 실행하거나 클라이언트 인코딩을 UTF-8로 맞춘다.
4. 검증
powershell
docker exec -it oracle-free sqlplus ORA_SQL_TEST/1qaz2wsx@localhost:1521/FREEPDB1sql
EXEC DBMS_STATS.GATHER_SCHEMA_STATS('ORA_SQL_TEST');
SET PAGESIZE 50
SELECT table_name, num_rows FROM user_tables ORDER BY 1; -- 9개 테이블
SELECT COUNT(*) FROM T_ORD; -- 주문 수만 건
-- 한글 코드명 확인(인코딩 점검)
SELECT bas_cd, bas_cd_nm FROM C_BAS_CD WHERE bas_cd_dv='ITM_TP'; -- 가전제품/컴퓨터/주방기구/옷5. 챕터별 실습 (C2~C11) — 일반판 또는 ANSI판 택1
원하는 챕터 파일을 ORA_SQL_TEST로 열어 필요한 부분만 실행한다(전통 조인이면 루트, ANSI 조인이면 ANSI_/).
powershell
# 예: 6장 인덱스 실습 (T_ORD_BIG 대용량 생성 포함 → 인덱스 전/후 성능 비교)
docker exec -i oracle-free sqlplus ORA_SQL_TEST/1qaz2wsx@localhost:1521/FREEPDB1 < "C6_INDEX.sql"- C6_INDEX:
T_ORD_BIG(대용량)과 인덱스를 만든다. 인덱스를 만들기 전과 후의 실행계획과 Buffers를 비교하는 본무대다. - C7_JOIN과성능:
T_ORD_JOIN과 여러 인덱스를 만들어 NL, 해시, 소트 머지 조인을 튜닝한다. - C8_OLTP_SQL기술:
M_ACC/T_PO/시퀀스를 만들어 트랜잭션, 락, 데드락, 채번을 다룬다. - 나머지(C2~C5, C9~C11)는 위 테이블로 SELECT 위주의 실습을 한다.
성능 장에서는 책이 다음 측정 도구를 쓴다:
SET AUTOTRACE,/*+ GATHER_PLAN_STATISTICS */+DBMS_XPLAN.DISPLAY_CURSOR,ALTER SYSTEM FLUSH BUFFER_CACHE(격리된 실습 인스턴스에서만).
6. 데이터 모델 요약
| 구분 | 테이블 | 의미 | 키 |
|---|---|---|---|
| 공통코드 | C_BAS_CD / C_BAS_CD_DV | 기준코드 / 코드구분 | (CD_DV,LNG,CD) / (CD_DV) |
| 마스터 | M_RGN | 지역 | RGN_ID |
| M_ITM / M_ITM_PRC_HIS | 상품 / 가격이력 | ITM_ID / (ITM_ID,TO_YMD) | |
| M_CUS | 고객(RGN_ID→M_RGN) | CUS_ID | |
| 트랜잭션 | T_ORD / T_ORD_DET | 주문 / 주문상세 | ORD_SEQ / (ORD_SEQ,ORD_DET_NO) |
| T_ITM_EVL | 상품평가 | (ITM_ID,EVL_LST_NO) | |
| (성능장 생성) | T_ORD_BIG(C6) · T_ORD_JOIN(C7) · M_ACC/T_PO(C8) | 대용량·OLTP 실습용 | 챕터에서 생성 |
FK 7개: C_BAS_CD→C_BAS_CD_DV, M_ITM_PRC_HIS→M_ITM, M_CUS→M_RGN, T_ITM_EVL→M_CUS·M_ITM, T_ORD→M_CUS, T_ORD_DET→T_ORD.
CUS_ID는 VARCHAR2('CUS_0001')이고, 날짜 일부는YYYYMMDD문자열이다(TO_YMD/BTH_YMD).
7. 트러블슈팅
| 증상 | 해결 |
|---|---|
C1_01 원본 실행 시 ORA-01119/02236(E:\ 경로·OMF) | 원본 대신 1단계 적응판(USERS) 사용 |
한글 코드명이 ???/깨짐 | UTF-8 클라이언트로 실행(SQL Developer 권장) |
C6 GATHER_TABLE_STATS('ORA_SQL_TEST',...) 오류 | 계정명이 ORA_SQL_TEST가 아니다. 계정명을 바꾸면 안 된다 |
| FK 위반(ORA-02291) | C1_02→C1_03 순서대로. 마스터 먼저, 트랜잭션 나중(파일이 이미 그 순서로 짜여 있다) |
ALTER SYSTEM FLUSH ... 권한오류 | 1단계의 GRANT ALTER SYSTEM 확인(FLUSH는 격리 인스턴스에서만) |
8. 정리 / 재설치
sql
-- (sys) 완전 제거 후 재구축
ALTER SESSION SET CONTAINER = FREEPDB1;
DROP USER ORA_SQL_TEST CASCADE;
-- 이후 1→3단계 반복요약: 1) (SYS) 적응판 사용자 생성 → 2) C1_02 테이블 → 3) C1_03 데이터 → 4) 통계·검증 → 5) C2~C11 챕터 실습(C6=T_ORD_BIG 대용량). 일반판과 ANSI판 중 하나만 쓴다.