17단원 '물리 데이터베이스 설계'의 열 레슨에서 10문제, 앞 단원(13·14·15)에서 4문제를 섞었고, 끝에 실기 꼴 3문제가 있습니다. 앞 단원 문제가 어느 레슨인지는 정답을 펼치면 보입니다. 실기 꼴은 종이에 답을 끝까지 쓴 뒤 펼치세요. 띄어쓰기만 다르면 같은 답입니다.
SQL 문제는 아래 네 표로 풉니다. 블록마다 처음 데이터에서 시작합니다. 학생의 학과코드는 학과를, 수강의 학번은 학생을, 수강의 과목코드와 과목의 선수과목은 과목을 가리킵니다. 학생의 학과코드는 비워 둘 수 있습니다.
학과
| 학과코드 | 학과명 | 건물 |
|---|---|---|
| CS | 컴퓨터 | 공학관 |
| EE | 전자 | 공학관 |
| BA | 경영 | 경영관 |
학생
| 학번 | 이름 | 학년 | 학과코드 |
|---|---|---|---|
| 101 | 김민수 | 3 | CS |
| 102 | 이서준 | 2 | CS |
| 103 | 김지민 | 2 | CS |
| 104 | 박서연 | 1 | EE |
| 105 | 최민준 | 3 | EE |
| 106 | 정하윤 | 3 | EE |
| 107 | 강도현 | 1 | NULL |
과목
| 과목코드 | 과목명 | 학점 | 선수과목 |
|---|---|---|---|
| DS | 자료구조 | 3 | NULL |
| OS | 운영체제 | 3 | DS |
| NW | 네트워크 | 2 | OS |
수강
| 학번 | 과목코드 | 점수 |
|---|---|---|
| 101 | DS | 85 |
| 101 | OS | 75 |
| 101 | NW | 80 |
| 102 | DS | 70 |
| 102 | OS | 60 |
| 103 | DS | 65 |
| 103 | NW | 55 |
| 104 | OS | 75 |
| 104 | NW | 95 |
| 105 | DS | 100 |
| 105 | NW | 90 |
| 107 | NW | 50 |
문제 1
주문 표에서 조회 조건으로 자주 쓰는 열에 인덱스를 하나 더 만들었습니다. 물리 설계에서 함께 보는 셋 가운데 응답 시간과 트랜잭션 처리량에 일어나는 일로 알맞은 것을 고르세요.
- ① 응답 시간이 짧아지고 트랜잭션 처리량도 늘어난다
- ② 응답 시간이 짧아지고 트랜잭션 처리량은 떨어진다
- ③ 응답 시간이 길어지고 트랜잭션 처리량은 늘어난다
- ④ 응답 시간이 길어지고 트랜잭션 처리량도 떨어진다
정답
② — 인덱스는 찾을 행을 적게 읽게 해 주어 조회의 응답 시간을 줄입니다. 그 대신 행을 넣고 고칠 때마다 인덱스까지 함께 고쳐야 해서, 정해진 시간에 처리하는 트랜잭션 수는 떨어집니다. 함께 보는 셋은 하나를 좋게 하면 다른 하나가 나빠지는 맞바꾸는 관계입니다.
- ① 인덱스가 모든 일을 빠르게 한다고 봤습니다. 읽는 일은 빨라지지만 넣고 고치는 일에는 인덱스를 고치는 품이 더 붙습니다.
- ③ 저장할 것이 늘면 조회까지 느려진다고 봤습니다. 조회는 인덱스를 따라 몇 칸만 읽어 되레 빨라집니다.
- ④ 인덱스를 공간만 더 쓰는 것으로 봤습니다. 공간을 더 쓰는 대가로 줄이는 것이 응답 시간입니다.
다시 볼 레슨: 물리 설계와 칼럼 속성
문제 2
학생 표의 학과코드는 지금 비워 둘 수 있는 열입니다. 앞으로는 비울 수 없게 하려고 다음 문장을 처음 데이터에 돌렸습니다. 결과로 알맞은 것을 고르세요.
ALTER TABLE 학생
MODIFY 학과코드 NOT NULL;
- ① 문장이 돌고, 학과코드가 비어 있던 행은 지워진다
- ② 문장이 돌고, 학과코드가 비어 있던 행에 값이 채워진다
- ③ 오류가 나고 아무것도 바뀌지 않는다 — 학과코드가 비어 있는 행이 이미 있다
- ④ 오류가 나고 아무것도 바뀌지 않는다 — NULL 허용은 표를 만들 때만 정할 수 있다
정답
③ — 열을 NOT NULL로 바꾸려면 그 열에 비어 있는 행이 하나도 없어야 합니다. 학생 표에는 학과코드가 비어 있는 강도현(107)이 있어, Oracle은 ORA-02296 오류를 내고 열을 그대로 둡니다. 그 행을 채우거나 지운 뒤에 다시 돌려야 합니다.
- ① 어긋나는 행을 DBMS가 치워 준다고 봤습니다. 제약 조건을 거는 문장은 행을 지우지 않고, 어긋나는 행이 있으면 거는 일 자체가 막힙니다.
- ② 비어 있던 칸이 어떤 값으로든 채워진다고 봤습니다. 칸을 채우는 것은
UPDATE문이고, 제약 조건을 거는 문장은 값을 넣지 않습니다. - ④ 칼럼 속성을 표를 만들 때만 정한다고 봤습니다. 자료형·길이·NULL 허용·기본값은
ALTER TABLE … MODIFY로 뒤에 바꿀 수 있습니다. 여기서 막은 것은 문법이 아니라 이미 들어 있는 NULL입니다.
다시 볼 레슨: DDL: CREATE·ALTER·DROP · 물리 설계와 칼럼 속성
문제 3
수강 표의 행을 점수 구간으로 나눈 표를 만들어 모두 옮겨 담았습니다. NUM_ROWS는 파티션마다 든 행 수입니다. P1·P2·P3의 행 수로 알맞은 것을 고르세요.
CREATE TABLE 수강_점수 (
학번 NUMBER,
점수 NUMBER
) PARTITION BY RANGE (점수) (
PARTITION P1
VALUES LESS THAN (60),
PARTITION P2
VALUES LESS THAN (80),
PARTITION P3
VALUES LESS THAN
(MAXVALUE)
);
INSERT INTO 수강_점수
SELECT 학번, 점수
FROM 수강;
ANALYZE TABLE 수강_점수
COMPUTE STATISTICS;
SELECT PARTITION_NAME,
NUM_ROWS
FROM USER_TAB_PARTITIONS
WHERE TABLE_NAME = '수강_점수'
ORDER BY PARTITION_POSITION;
- ① 2·5·5
- ② 2·6·4
- ③ 3·4·5
- ④ 3·5·4
정답
① — VALUES LESS THAN (60)은 60보다 작은 값까지만 받습니다. 점수 55·50 두 행이 P1에 들고, 60부터 79까지인 75·70·60·65·75 다섯 행이 P2에 들고, 80 이상인 85·80·95·100·90 다섯 행이 P3에 듭니다.
- ② 점수 80을 P2로 보냈습니다. P2가 받는 값은 80보다 작은 값까지라, 80은 다음 구간인 P3에 듭니다.
- ③ 점수 60을 P1로 보냈습니다. '60 미만'과 '60 이하'는 다릅니다.
- ④ 두 경곗값을 모두 앞 파티션으로 보냈습니다. 경계로 적은 값은 늘 뒤 파티션의 첫 값입니다.
| PARTITION_NAME | NUM_ROWS |
|---|---|
| P1 | 2 |
| P2 | 5 |
| P3 | 5 |
다시 볼 레슨: 파티셔닝
문제 4
두 표를 한 클러스터에 담아 함께 읽는 일을 빠르게 하려 합니다. 다음 가운데 클러스터링이 알맞지 않은 쓰임을 고르세요.
- ① 주문과 주문상세를 주문번호로 함께 읽는 일이 잦고, 주문번호는 한번 정해지면 바뀌지 않는다
- ② 사원과 부서를 부서코드로 함께 읽고, 부서 코드가 바뀌는 일은 몇 해에 한 번이다
- ③ 회원과 회원등급을 등급코드로 함께 읽고, 등급 코드는 좀처럼 바뀌지 않는다
- ④ 접속기록과 회원을 회원번호로 묶는다. 접속기록에는 초마다 수천 행이 들어오고, 월말 집계는 접속기록만 전부 훑는다
정답
④ — 클러스터링은 함께 읽는 일이 잦고 값이 잘 바뀌지 않는 짝에만 맞습니다. 넣기가 잦은 표는 키마다 잡아 둔 자리가 차서 넘친 행이 다른 블록으로 가고, 한 표만 전부 훑는 질의는 블록에 섞여 있는 다른 표의 행까지 읽습니다. 접속기록은 두 가지에 모두 걸립니다.
- ① 맞습니다. 함께 읽는 일이 잦고 클러스터 키가 바뀌지 않아 모아 두기에 맞는 짝입니다.
- ② 맞습니다. 키를 고치는 일이 아주 드물면 행이 다른 블록으로 옮겨 가는 품도 드물게 듭니다.
- ③ 맞습니다. 두 표에 공통인 값이 있고 그 값이 잘 바뀌지 않아 한 블록에 모아 둘 수 있습니다.
다시 볼 레슨: 클러스터링과 데이터 지역화
문제 5
주문 표와 주문상세 표를 주문번호로 함께 읽는 일이 잦습니다. (가)·(나)에 맞는 이름으로 알맞은 것을 고르세요.
-
(가) 두 표의 행을 주문번호가 같은 것끼리 한 디스크 블록에 섞어 담았습니다.
-
(나) 주문 표의 행 자체를 주문번호 순서로 줄 세워 저장했습니다. 한 표에 이렇게 할 수 있는 것은 하나뿐입니다.
-
① (가) 클러스터 · (나) 클러스터드 인덱스
-
② (가) 클러스터 · (나) 넌클러스터드 인덱스
-
③ (가) 클러스터드 인덱스 · (나) 클러스터
-
④ (가) 클러스터드 인덱스 · (나) 넌클러스터드 인덱스
정답
① — 클러스터는 클러스터 키가 같은 행을 표가 달라도 한 블록에 섞어 담습니다. 클러스터드 인덱스는 한 표의 행을 키 순서로 줄 세워 저장하는 것이고, 행은 한 가지 순서로만 놓일 수 있어 표에 하나뿐입니다.
- ② (나)를 넌클러스터드로 봤습니다. 넌클러스터드 인덱스는 행을 그대로 두고 키와 행 위치만 따로 정렬해 두는 것이라 여럿 만들 수 있습니다.
- ③ 두 이름을 바꿔 봤습니다. 이름이 닮았지만 클러스터는 표가 다른 행까지 모으고, 클러스터드 인덱스는 한 표의 행만 줄 세웁니다.
- ④ (가)까지 인덱스로 봤습니다. 클러스터드 인덱스는 한 표의 행을 줄 세우는 것이고, 표 둘의 행을 한 블록에 섞어 담지는 않습니다.
다시 볼 레슨: 인덱스 · 클러스터링과 데이터 지역화
문제 6
어느 회사가 사원 표를 두 서버에 나눠 둡니다. 사원번호·이름은 서울 서버에, 사원번호·급여는 부산 서버에 두고, 두 조각을 사원번호로 이어 원래 표를 되돌립니다. 이 나누기의 이름으로 알맞은 것을 고르세요.
- ① 수평 단편화
- ② 수직 단편화
- ③ 할당
- ④ 복제
정답
② — 열을 골라 가르는 것이 수직 단편화입니다. 조각마다 같은 키 열을 두고, 다시 모을 때는 그 키로 이어 붙입니다.
- ① 행을 조건으로 가르는 쪽입니다. '서울 사원은 서울 서버, 부산 사원은 부산 서버'처럼 나누면 수평 단편화입니다.
- ③ 쪼갠 조각을 어느 서버에 둘지 정하는 일의 이름입니다. 쪼개는 방향의 이름이 아닙니다.
- ④ 같은 조각을 여러 서버에 두는 것입니다. 여기서는 서로 다른 열을 나눠 두었습니다.
다시 볼 레슨: 분산 데이터베이스
문제 7
병행 제어 기법 가운데 락을 쓰지 않아 교착 상태가 생기지 않는 것끼리 묶인 것을 고르세요.
- ① 로킹과 2단계 로킹
- ② 로킹과 타임스탬프 순서
- ③ 2단계 로킹과 낙관적 검증
- ④ 타임스탬프 순서와 낙관적 검증
정답
④ — 타임스탬프 순서는 트랜잭션에 붙인 시각의 앞뒤로 접근 순서를 따지고, 낙관적 검증은 끝낼 때가 되어서야 부딪혔는지 따집니다. 둘 다 락을 걸지 않아 서로의 락을 기다리는 교착 상태가 생기지 않습니다.
- ① 둘 다 락을 거는 기법입니다. 2단계 로킹은 락을 얻는 단계와 푸는 단계를 나눈 규약이고, 교착 상태를 막지는 못합니다.
- ② 타임스탬프 순서는 락을 쓰지 않지만, 로킹은 락을 거는 일 그 자체입니다.
- ③ 낙관적 검증은 락을 쓰지 않지만, 2단계 로킹은 락을 거는 규약입니다.
다시 볼 레슨: 병행 제어
문제 8
어느 시스템이 Eager 방식(eager)으로 이중화되어 있습니다. 이 시스템을 운영하면서 겪는 일로 옳지 않은 것을 고르세요.
- ① 주문을 고치는 데 걸리는 시간이 이중화하기 전보다 길어졌다
- ② 복제 서버를 점검하려고 꺼 둔 동안에는 주문을 고칠 수 없었다
- ③ 복제 서버를 읽는 통계 화면에 몇 분 전 값이 보이는 일이 가끔 있다
- ④ 주 서버와 복제 서버의 주문 건수를 같은 순간에 세면 늘 같다
정답
③ — 커밋을 먼저 마치고 변경을 나중에 보내는 Lazy 방식에서 일어나는 일입니다. Eager 방식은 복제 서버에 반영한 뒤에 커밋을 마치므로, 커밋이 끝난 뒤 복제 서버를 읽으면 늘 새 값이 나옵니다.
- ① 맞습니다. 커밋이 복제 서버의 반영을 기다리므로 고치는 데 걸리는 시간이 늘어납니다.
- ② 맞습니다. 변경과 복제가 한 트랜잭션에 묶여 있어, 복제 서버에 반영할 수 없으면 변경 자체가 취소됩니다.
- ④ 맞습니다. 어느 순간에 봐도 두 서버의 값이 같은 것이 이 방식을 고르는 까닭입니다.
다시 볼 레슨: 데이터베이스 이중화
문제 9
트랜잭션이 도는 중에 바꾼 값을 그때그때 데이터베이스에 써 넣는 시스템입니다. 장애가 난 뒤 로그를 보니 T의 COMMIT은 적혀 있고, S의 COMMIT은 적혀 있지 않았습니다. 회복할 때 두 트랜잭션에 하는 일로 알맞은 것을 고르세요.
- ① T는 다시 반영하고(REDO), S는 되돌린다(UNDO)
- ② T는 다시 반영하고(REDO), S에는 할 일이 없다
- ③ T에는 할 일이 없고, S는 되돌린다(UNDO)
- ④ 두 트랜잭션 모두 할 일이 없다
정답
① — 바꾼 값을 그때그때 써 넣는 방식이라, 끝내지 못한 S의 변경이 이미 데이터베이스에 들어가 있을 수 있습니다. 그래서 S는 로그의 바꾸기 전 값으로 되돌리고, COMMIT을 마친 T는 로그의 바꾼 뒤 값으로 다시 반영합니다. 이 방식은 두 연산을 모두 씁니다.
- ② 끝내지 못한 트랜잭션의 흔적이 데이터베이스에 없다고 봤습니다. 그것은 끝낼 때까지 데이터베이스를 건드리지 않는 지연 갱신입니다.
- ③ 바로 써 넣었으니 다시 반영할 것이 없다고 봤습니다. 이 방식은 COMMIT한 트랜잭션에 REDO를, 끝내지 못한 트랜잭션에 UNDO를 모두 씁니다.
- ④ 로그를 보고 할 일이 없다고 봤습니다. 회복은 로그에 COMMIT이 적혔는지로 두 트랜잭션을 가릅니다.
다시 볼 레슨: 회복
문제 10
수요일 밤에 데이터베이스를 한 벌 통째로 뜨고, 목·금·토 밤마다 증분 백업을 뜨며, 낮에는 로그 백업을 몇 분마다 뜨는 운영입니다. 일요일 새벽에 디스크가 망가졌습니다. 되살리는 차례로 알맞은 것을 고르세요.
- ① 전체 백업 → 목·금·토 증분을 뜬 순서대로 → 로그 백업
- ② 전체 백업 → 가장 최근 증분인 토요일 것 하나 → 로그 백업
- ③ 목·금·토 증분을 뜬 순서대로 → 전체 백업 → 로그 백업
- ④ 로그 백업 → 전체 백업 → 목·금·토 증분을 뜬 순서대로
정답
① — 증분 백업은 마지막 백업 뒤에 바뀐 것만 담아 날마다 담은 것이 서로 다릅니다. 밑바탕인 전체 백업을 되살린 뒤 그 뒤의 증분을 뜬 순서대로 모두 되돌리고, 마지막으로 로그 백업을 시간 순서대로 반영해 장애 직전으로 맞춥니다.
- ② 가장 최근 하나로 끝난다고 봤습니다. 그것은 뒤의 것이 앞의 변경까지 품는 차등 백업입니다. 증분은 하나라도 빠지면 그 뒤를 되돌릴 수 없습니다.
- ③ 증분을 먼저 되돌렸습니다. 되살릴 밑바탕이 아직 없어 되돌릴 자리가 없습니다.
- ④ 로그 백업을 먼저 반영했습니다. 로그 백업은 데이터 백업 뒤에 쌓인 변경이라 맨 마지막에 반영합니다.
다시 볼 레슨: 데이터베이스 백업
문제 11
DAS로 쓰던 데이터베이스 저장 장치를 바꾸려 합니다. 서버 넷이 같은 데이터를 함께, 업무 트래픽에 밀리지 않고 빠르게 읽어야 하고, 저장 전용 망 장비를 갖출 예산도 있습니다. 알맞은 방식과 그 까닭을 고르세요.
- ① NAS — 깔려 있는 업무용 네트워크에 올리면 장비를 더하지 않아도 된다
- ② NAS — 서버마다 블록 단위로 받아 자기 디스크처럼 쓴다
- ③ SAN — 저장 전용 망으로 묶어 업무 트래픽에 밀리지 않는다
- ④ SAN — 서버에 케이블로 바로 꽂아 거치는 것이 없다
정답
③ — 서버 여럿이 함께 쓰면서 업무 트래픽에 밀리지 않아야 하니, 저장 장치만을 위한 전용 망으로 묶는 방식이 맞습니다. 서버는 블록 단위로 받아 자기 디스크처럼 씁니다.
- ① 장비를 더하지 않는 쪽만 보고 골랐습니다. NAS는 업무용 네트워크를 함께 써서, 그 네트워크가 붐비면 데이터를 읽는 속도도 함께 떨어집니다.
- ② 블록 단위로 주는 쪽을 NAS로 봤습니다. NAS는 파일 단위로 주고, 블록 단위로 주는 쪽은 DAS와 SAN입니다.
- ④ DAS의 모습을 SAN에 붙였습니다. 케이블로 바로 꽂는 쪽이 DAS이고, 그러면 붙은 서버 한 대에 매여 넷이 함께 쓸 수 없습니다.
다시 볼 레슨: 스토리지: DAS·NAS·SAN
문제 12
회원 표의 전화번호 열을 암호화했습니다. 그 뒤로 전화번호가 '010'으로 시작하는 회원을 찾는 질의만 전보다 훨씬 느려졌습니다. 가장 알맞은 설명을 고르세요.
- ① 암호문이 원래 값보다 길어져 읽어 오는 바이트가 늘었다
- ② 암호문은 원래 값의 순서를 지키지 않아, 그 열의 인덱스로 범위를 좁힐 수 없다
- ③ 암호화한 열은 읽을 때 되돌리지 않아, 맞는 행을 두 번 찾아야 한다
- ④ 암호화는 넣을 때만 일이 늘고, 읽기는 암호화하지 않은 열과 같다
정답
② — 암호화한 열은 값의 순서가 뒤섞여 범위 검색이나 정렬이 그대로 되지 않고, 그 열의 인덱스 범위 스캔도 쓸 수 없습니다. 그래서 범위로 좁히던 질의가 모든 행을 되돌려 견주는 일이 됩니다.
- ① 암호문이 길어지는 것은 맞습니다. 다만 그것만으로는 범위로 찾는 질의만 유난히 느려지는 까닭이 되지 않습니다. 길어지는 것은 열 길이를 늘려야 할 수 있다는 이야기입니다.
- ③ 읽을 때 되돌리지 않는다고 봤습니다. 암호화한 열은 읽을 때 되돌려 보여 주고, 그 되돌리는 일에도 시간이 듭니다.
- ④ 읽기는 그대로라고 봤습니다. 암호화와 복호화 모두 시간이 들어 넣기와 읽기가 함께 느려집니다.
다시 볼 레슨: 데이터베이스 암호화
문제 13
논리 데이터 모델을 물리 데이터 모델로 옮깁니다. 논리 모델의 (가) 개체와 (나) 관계가 각각 무엇이 되는지 알맞은 것을 고르세요.
- ① (가) 열 · (나) 기본키 제약 조건
- ② (가) 열 · (나) 외래키 제약 조건
- ③ (가) 표 · (나) 기본키 제약 조건
- ④ (가) 표 · (나) 외래키 제약 조건
정답
④ — 개체는 실제로 만들 표가 되고, 두 개체를 잇던 관계는 한쪽 표의 열에 거는 외래키 제약 조건이 됩니다. 속성이 열과 그 타입·길이가 되고, 키 속성이 기본키 제약 조건이 됩니다.
- ① 개체를 열로, 관계를 기본키로 봤습니다. 열이 되는 것은 속성이고, 기본키가 되는 것은 키 속성입니다.
- ② 관계는 맞게 봤지만 개체를 열로 봤습니다. 개체 하나가 표 하나가 됩니다.
- ③ 개체는 맞게 봤지만 관계를 기본키로 봤습니다. 기본키는 한 표 안에서 행을 가리키는 키이고, 두 표를 잇는 것은 외래키입니다.
다시 볼 레슨: 물리 E-R 다이어그램과 CRUD 분석
문제 14
어느 DBMS의 옵티마이저는 표의 행 수와 값의 분포를 보지 않고, 미리 정해 둔 규칙의 순위만 따라 길을 고릅니다. 행이 백 개뿐인 작은 표의 한 열에 인덱스가 걸려 있고, 그 열을 조건으로 쓰는 질의가 왔습니다. 이 옵티마이저가 고르는 길과 그 방식의 이름으로 알맞은 것을 고르세요.
- ① 전체를 읽는 편이 싸므로 전체 스캔 — 규칙 기반 옵티마이저
- ② 표가 작아도 인덱스가 있으므로 인덱스 — 규칙 기반 옵티마이저
- ③ 전체를 읽는 편이 싸므로 전체 스캔 — 비용 기반 옵티마이저
- ④ 표가 작아도 인덱스가 있으므로 인덱스 — 비용 기반 옵티마이저
정답
② — 데이터를 보지 않고 정해 둔 순위만 따르는 것이 규칙 기반 옵티마이저입니다. '인덱스가 있으면 인덱스를 쓴다'는 순위를 따르므로, 표가 작아 전체를 읽는 편이 싼 경우에도 인덱스를 거칩니다.
- ① 방식의 이름은 맞게 봤지만 고르는 길을 거꾸로 봤습니다. 어느 쪽이 싼지 따지려면 행 수와 분포를 담은 통계 정보가 있어야 합니다.
- ③ 통계 정보를 보고 싼 쪽을 고르는 쪽은 비용 기반이 맞습니다. 다만 문제의 옵티마이저는 통계를 보지 않습니다.
- ④ 비용 기반이 인덱스를 늘 쓴다고 봤습니다. 비용 기반은 걸리는 행이 많거나 표가 작으면 전체 스캔을 고릅니다.
다시 볼 레슨: SQL 성능 튜닝과 옵티마이저
문제 15 (실기)
어느 회사의 백업 운영입니다. 월요일 밤에 데이터베이스를 한 벌 통째로 뜨고, 화요일부터 금요일까지는 밤마다 (가)를 뜨며, 낮에는 (나)를 몇 분마다 뜹니다. 금요일 낮에 디스크가 망가졌을 때, 통째로 뜬 것과 목요일 밤 (가) 하나만 되돌린 뒤 (나)를 시간 순서대로 반영해 장애 직전으로 맞췄습니다. (가)·(나)에 맞는 백업의 이름을 한글로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
정답
받는 답: (가) 차등 백업 · (나) 로그 백업
(가)의 실마리는 '밤마다 떴는데 되돌린 것은 가장 최근 하나뿐'입니다. 마지막 전체 백업 뒤에 바뀐 것을 모두 담기 때문에, 뒤에 뜬 하나에 앞의 변경이 다 들어 있습니다. (나)는 '데이터 백업 사이에 쌓인 것을 떠서 장애 직전까지 맞춘다'가 실마리입니다.
- 같은 이름의 다른 꼴: (가) Differential Backup · (나) Log Backup — 영문 이름입니다. 문제가 한글로 물었습니다.
- 틀리는 꼴 증분 백업 — (가)에: 마지막 백업 뒤에 바뀐 것만 담습니다. 그렇게 운영했다면 화·수·목에 뜬 것을 뜬 순서대로 모두 되돌려야 합니다.
- 틀리는 꼴 전체 백업 — (가)에: 데이터베이스를 한 벌 통째로 뜨는 백업이고, 문제에서 월요일 밤에 뜬 것이 그것입니다.
- 틀리는 꼴 로그 — (나)에: 데이터베이스가 쌓아 두는 변경 기록 자체의 이름입니다. (나)는 그 기록을 따로 떠 두는 백업의 이름입니다.
다시 볼 레슨: 데이터베이스 백업
문제 16 (실기)
데이터베이스에서 사용자마다 어느 표에 무엇을 할 수 있는지 미리 정해 두고, 정해 두지 않은 요청은 DBMS가 막습니다. GRANT로 주고 REVOKE로 거두는 권한이 그 수단입니다. 이 일의 이름을 영문으로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
정답
받는 답: Access Control
실마리는 '누가 어느 표에 무엇을 할 수 있는지 미리 정해 두고 그 밖의 요청을 막는다'입니다. 권한을 주고 거두는 일이 그 수단이고, 그 일 전체를 가리키는 이름입니다.
- 같은 이름의 다른 꼴: 접근 제어 — 한글 이름입니다. 문제가 영문으로 물었습니다.
- 틀리는 꼴 ROLE: 권한 여러 개를 묶어 이름을 붙인 것입니다. 묶음의 이름이고, 요청을 막는 일의 이름이 아닙니다.
- 틀리는 꼴 TDE(Transparent Data Encryption): 저장하는 값을 열쇠 없이 읽지 못하게 바꿔 두는 방식입니다. 권한은 질의하는 길을 막고, 암호화는 데이터 파일을 들고 가도 읽지 못하게 합니다.
다시 볼 레슨: DCL: GRANT·REVOKE · 데이터베이스 암호화
문제 17 (실기)
다음을 처음 데이터에 돌렸습니다. EXPLAIN PLAN은 쿼리를 돌리지 않고 계획만 만들어 PLAN_TABLE에 넣고, STATEMENT_ID는 그 계획에 붙인 이름입니다. 마지막 조회가 몇 줄로 나오는지, 계획 A와 계획 B의 비용(ID가 0인 줄의 COST)이 각각 얼마인지, 계획 B에 표를 찾아가는 줄(TABLE ACCESS)이 있는지를 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
EXPLAIN PLAN
SET STATEMENT_ID = 'A' FOR
SELECT 학년
FROM 학생
WHERE 학과코드 = 'CS';
CREATE INDEX 학생_학과_IX
ON 학생 (학과코드);
EXPLAIN PLAN
SET STATEMENT_ID = 'B' FOR
SELECT 학년
FROM 학생
WHERE 학과코드 = 'CS';
SELECT STATEMENT_ID, ID,
OPERATION, OPTIONS, COST
FROM PLAN_TABLE
ORDER BY STATEMENT_ID, ID;
정답
받는 답: 다섯 줄 · 계획 A의 비용 3 · 계획 B의 비용 2 · 계획 B에도 TABLE ACCESS 줄이 있다
계획 A는 인덱스가 없어 학생 표를 처음부터 끝까지 읽는 전체 스캔이라 두 줄입니다. 인덱스를 만든 뒤인 계획 B는 인덱스에서 CS인 행의 위치를 찾고(ID 2), 고르는 열인 학년이 인덱스에 없어 그 위치로 표를 찾아갑니다(ID 1). 그래서 B는 세 줄이고, 둘을 합해 다섯 줄입니다. 비용은 3에서 2로 줄었습니다.
- 틀리는 꼴 네 줄 · B의 비용 1 ·
TABLE ACCESS줄 없음: 인덱스만 읽고 끝난다고 봤습니다. 고르는 열이 조건 열과 같으면 그렇지만, 여기서는 학년을 고르므로 표를 찾아가야 합니다. - 틀리는 꼴 네 줄 · B의 비용 3 · 전체 스캔 그대로: 인덱스를 만들어도 계획이 바뀌지 않는다고 봤습니다. 비용 기반 옵티마이저는 인덱스를 거치는 쪽이 싸면 그쪽으로 바꿉니다.
- 틀리는 꼴 다섯 줄 · B의 비용 3: 계획은 바뀌지만 비용은 그대로라고 봤습니다. 계획이 바뀐 까닭이 어림한 비용이 더 작기 때문입니다.
| STATEMENT_ID | ID | OPERATION | OPTIONS | COST |
|---|---|---|---|---|
| A | 0 | SELECT STATEMENT | NULL | 3 |
| A | 1 | TABLE ACCESS | FULL | 3 |
| B | 0 | SELECT STATEMENT | NULL | 2 |
| B | 1 | TABLE ACCESS | BY INDEX ROWID BATCHED | 2 |
| B | 2 | INDEX | RANGE SCAN | 1 |
다시 볼 레슨: SQL 성능 튜닝과 옵티마이저 · 인덱스