취득 목적

6월말부터 출퇴근 시간, 점심시간, 퇴근 후 집에서 하루에 5~10문제, 밀린 날엔 20~30까지도 풀었다.
일단 노베이스로 1회독을 돌렸다(당근 절반 이상 틀렸다ㅋ)
2번째 부터는 챕터별로 끊어서 풀고 속도를 높이고 2번 틀리면 풀이를 외웠다.
답지 해설을 노션에 요약해서 외우고, 구글에 sqld 요약 검색해서 아주 조금씩 일하면서 외웠다.
바깥에서도 다른 블로드들의 후기나 기출문제, 오답노트등을 외웠다.
물론 60% 이상 맞추면 합격인 비교적 쉬운 자격증이라지만 높은 점수를 원한다면 문제집 1권으로는 어려울 것 같다.
lag(), lead()부분과 connect by prior~ 부분을 많이 버벅였다.


얘가 무슨 아이인지 용어 설명을 읊는 것이 중요한 게 아니라, 예시를 보고 이건 A, 저건 B라고 바로 말할 수 있는 훈련을 하는 게 좋다.
시험 시간은 1시간 반이고 시험은 44 객관식과 6개의 주관식이었다.
조인 문제가 많이 나온다.
학업과 회사와 병행하느라 시간 투자가 적었지만
그래도 문제를 많이 풀고 매칭, 연관 연습을 하는 게 좋았을 거 같다. 후회는 없음.
아래는 공부하면서 오답들을 정리했던 노션 내용이다.
인덱스 종류
브랜치 블록(분기 목적), 리프 블록(인덱스 구성 컬럼 값으로 정렬)으로 구성
OLTP 환경에서 많이 사용
인덱스의 리프 페이지가 곧 데이터 페이지이다.
리프 페이지의 모든 데이터는 인덱스 키 컬럼 순으로 물리적으로 정렬되어 저장된다.
DW와 AD-HOC 질의 환경을 위해서 설계되었다. (시스템 질의를 시스템 구현 시에 모두 알 수 없음)
하나의 인덱스 키 엔트리가 많은 행에 대한 포인터를 저장하고 있는 구조이다.
오라클 한정으로 select문에 없는 컬럼을 order by에 쓸 수 있다.
그러나 Group By를 사용하면 Order By에서 Group By의 컬럼들 외에 사용할 수 없다.
오라클은 ‘’을 Null 취급한다.
오라클은 NULL값을 꼭 IS NULL로 체크한다. (=, 즉 등치 비교 안됨)
SQL Server에서 Null을 조회하려면 꼭 = 로 조회해야 한다. (IS NULL 안됨)
어려웠다.
- Group By로 그룹핑된 컬럼에 대해서 Having 조건절을 쓰면,
Having절에 집계함수가 없어도 사용이 가능하다.- 중첩된 그룹함수의 결과값은 무조건 1개다.
그래서 Group By의 컬럼들은 Select절에 기술할 수 없다.
count(*)는 null인 데이터도 포함하지만, count(컬럼명)은 null인 데이터를 제외한다.
count(grade)로 되어 있다면 등급을 가진 데이터만 조회되어야 한다!!!! (직급 없으면 제외)
단일행 함수는 다중행을 리턴할 때 사용할 수 없지만,
다중행 함수는 단일행을 리턴할 때 사용할 수 있다.
인라인 뷰(쿼리로 만든 가상 테이블)에서 (년도 등의)조건을 걸었다면
이후 where절의 조건에서는 인라인 뷰의 조건이 필요없다.
클래스다이어그램 : 존재적 관계와 행위에 의한 관계를 연관관계와 의존관계로 표현한다.
ERD : 존재관계와 행위관계를 구분하지 않는다.
해당업무에서 사용하는 이름을 부여한다.
서술식 속성명은 사용하지 않는다.
약어사용은 가급적 제한한다.
전체 데이터모델에서 유일성 확보하는 것이 좋다.
테이블 INSERT문에서 삽입 컬럼을 명시하지 않았을 경우 모든 컬럼을 삽입해야 한다.
또한 null 여부를 not null로 지정하지 않으면, 컬럼값을 null 가능으로 지정한다.
TCL은 트랜잭션 제어어, COMMIT과 ROLLBACK이 있다.
DCL은 데이터 제어어, GRANT와 REVOKE가 있다.
DML은 데이터 조작어, 데이터 CRUD하는 명령어들
DDL은 데이더 정의어, 테이블 CRUD하는 명령어들
1~20
모델링 주의사항 (2번 틀림)
- 중복성 - 여러 장소에 같은 정보를 저장하지 않아야 한다.
- 비유연성
해결 : 데이터 정의와 사용 프로세스를 분리해서 데이터나 프로세스와 애플리케이션과 디비의 관계를 약화시킨다.- 비일관성 - 데이터 간의 연관된 정보가 있는데 이를 무시하고 데이터가 갱신되는 경우다.
예: 프로세스, 프로그램과 테이블의 연계성을 높여서 업무 변경에 취약하게 만든다.
엔티티 배치 위치 - 가독성
사람 눈은 왼쪽 → 오른쪽, 위 → 아래로 이동하므로
왼쪽 상단에 가장 중요한 엔티티 배치, 업무 중요 엔티티는 왼쪽 상단 조금 아래쪽 중앙
개념 모델링
추상화 수준이 높고, 업무중심적이고, 포괄적인
논리 모델링
key, 속성, 관계 표현이 정확하고 재사용성이 높은
물리 모델링
실제 디비에 이식할 수 있게 성능, 저장 등 물리 성격을 고려
(엔티티) 도출 → 배치 → 관계 설정 → 관계명 기술 과정을 거친다.
업무에서 필요한 인스턴스에서 관리하고자 하는 최소의 데이터 단위
*각 엔티티별로 동일한 속성명을 쓰지 않는다 (전체 모델에서 유일성 확보 필요)
ERD는 존재적 관계와 행위에 의한 관계를 구분하지 않는다.
클래스다이어그램은 위 둘을 구분하여 연관관계와 의존관계로 표현한다.
31~40
문제 발생 시점의 SQL을 중심으로 집중 튜닝하는 건 성능 모델링과 무관하다.
플젝 초기에 테스트 환경에 트랜잭션을 걸어 성능을 테스트한다.
분석/설계 시 데이터 모델도 구조 바꿔가며, 좋은 성능으로 디자인한다.
반정규화 - 성능을 위한 테이블 합치기
데이터를 중복하여 성능 향상시키기부터
정규화된 데이터 모델에서 중복, 통합, 분리 등을 수행하는 모든 과정을 말한다.
예: 경로가 멀어 조인성능저하, 컬럼 계산해서 읽을때 성능 저하, 조회 시 디스크 I/O 성능 저하
정규화는 조회 성능을 높이기 위한 것이다. 항상 성능을 낮추지는 않는다.
1차 정규화의 대상
- 컬럼 단위 중복
- 컬럼에 의한 반복적인 속성값을 갖는 형태 (원자성 위배) ⇒ 중복 속성
- 부분 함수종속의 규칙을 가진다.
- PK에 대해 반복이 되는 그룹이 존재하지 않는다.
- 로우단위 중복
성능 데이터 모델링
디비 성능 향상을 목적으로 설계 단계부터 성능 사항을 데이터 모델링에 반영하는 것.
41~50
개발과 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 디비 모델링 기법이다.
반정규화 하는 이유
- 데이터 조회 시 디스크 I/O량이 많아서 성능이 저하될 경우
- 경로가 너무 멀어 조인으로 인한 성능저하가 예상되거나
- 컬럼을 계산하거나 읽을 때 성능저하가 예상되는 경우
반정규화에는 테이블과 컬럼으로 나눠진다 (이걸 2번 틀렸다..)
테이블의 반정규화
| 기법 분류 | 반정규화 기법 |
|---|---|
| 테이블병합 | 1:1, 1:M, 수퍼/서브타입 테이블 병합 (3가지) |
| 테이블분할 | 수직분할과 수평 분할 (2가지) |
| 테이블 추가 | 중복테이블 추가, 통계테이블 추가, 이력테이블 추가, 부분테이블 추가 (4가지) |
컬럼의 반정규화
| 반정규화 기법 |
|---|
| 중복컬럼 추가 |
| 파생컬럼 추가 |
| 이력테이블 컬럼 추가 |
| PK에 의한 컬럼 추가 |
| 응용시스템 오작동을 위한 컬럼 추가 |
테이블추가 반정규화 기법 - 부분 테이블 추가
하나의 테이블의 전체 컬럼 중 자주 이용하는 집중화된 컬럼들이 있을 때 디스크 I/O를 줄이기 위해 해당 컬럼들을 별도로 모아 놓는 반정규화 기법
FK에 대한 속성 추가는 반정규화 기법이 아니다.
데이터 모델링에서 ****관계 연결 시 생기는 자연스러운 현상이다.
데이터 무결성을 깨뜨리지 않고 데이터 처리 성능을 올리는 방법 : 중복관계 추가
장점
트랜잭션이 개별인가 전체인가 슈퍼+서브냐에 따라서 3가지 테이블 구조로 각각 처리된다.
한 테이블에 너무 많은 컬럼이 있다면 tx가 접근하는 컬럼유형을 분석하여 1:1 테이블로 분리한다.
장점
- 지역 자치성, 점증적 시스템 용량 확장
- 신뢰성과 가용성
- 효용성과 융통성
- 빠른 응답 속도와 통신비용 절감
- 데이터의 가용성과 신뢰성 증가
- 시스템 규모의 적절한 조절
- 각 지역 사용자의 요구 수용 증대
단점
- 소프트웨어 개발 비용
- 오류의 잠재성 증대
- 처리 비용의 증대
- 설계, 관리의 복잡성과 비용
- 불규칙한 응답 속도
- 통제의 어려움
- 데이터 무결성에 대한 위협
위치 투명성 : 데이터 저장 장소 명시가 불필요하며 위치정보가 SYSTEM CATALOG에 유지되어야함.
지역 사상 투명성 : 지역 DBMS와 물리적 DB 사이의 MAPPING을 보장한다.
절차적 : What + How vs. 비절차적 : What
한번에 데이터를 조회하려면 엔티티 전체를 통합한 계산된 컬럼을 추가한다.
최근에 변경된 값만을 조회할 경우 과도한 조인으로 성능이 저하된다.
‘=’로 들어온 조건에 해당하는 컬럼이 인덱스의 가장 앞쪽에 위치할 때 인덱스의 이용 효율성이 가장 높다.
널 값은 0 또는 공백과 다르다. (각각은 숫자, 하나의 문자로 취급된다.)
테이블 생성시 NOT NULL을 지정하지 않으면 디폴트가 NULL로 설정된다.
널이 포함된 사칙연산은 결과값이 무조건 널이다.
널값과의 비교 연산은 FALSE를 리턴한다.
특정 값보다 작다, 크다 할 수 없다.
결과값이 널이 아닌 값을 원하면 NVL/ISNULL 함수를 사용한다. 숫자면 주로 0, 문자면 의미 없는 문자 ‘X’등으로 치환된다
NULL 관련 함수
다중 행 함수에 NVL()을 쓰면 부하가 발생 (굳이 이러지 마)
COALESCE 함수는 첫번째로 NULL이 아닌 값을 반환한다.
널이 아닌 값을 발견하면 바로 그 ROW의 컬럼 등을 반환한다. 뭐 그런~
NULLIF 함수는 두 표현식이 같으면 NULL을, 같지 않으면 첫번째 표현식을 반환한다.
(특정 값을 NULL로 대체하고 싶을 때 사용한다)
SQL Server는 NULL값을 인덱스 맨 앞에 저장하고 Oracle은 맨 뒤에 저장한다.
분모에 0이 들어가는 경우 연산 자체가 에러가 발생한다. 즉 0으로 나누지 말라.
예) 5000/0 ⇒ 에러 발생 (0/300은 0이다)
DBMS 옵티마이저는 FROM 절에 테이블들이 아무리 많아도 2개를 택한다.
두 가지 이상의 기준으로 GROUP BY 했을 때 표현식으로 데이터를 확인하고 싶다면
(어렵다..)
서브쿼리에서 문제를 엄청 틀렸다ㅋㅋㅋ
동작 방식에 따라 비연관 서브쿼리와 연관 서브쿼리로 나뉜다.
반환 데이터 형태에 따라 단일 행 서브쿼리와 다중 행 서브쿼리로 나뉜다.
다중 행 비교 연산자
스칼라 서브쿼리 : 1행 1열만 반환하는 서브쿼리, SELECT절에 사용
뷰 : 가상의 테이블 FROM에서 쓰는 뷰는 인라인 뷰라고 한다.
서브쿼리 응용 → WITH 뷰 이름 AS (SELECT ~)
메인 쿼리를 작성할 때 서브쿼리에 있는 컬럼을 자유롭게 사용할 수 없다.
order by는 쿼리 맨 마지막 줄에 한번만!
일반 집합 연산자와 SQL을 비교
테이블에 계층형 데이터가 존재하는 경우 데이터를 조회하기 위해서 계층형 질의를 쓴다.
계층형 데이터란 동일 테이블에 계층적으로 상위와 하위 데이터가 포함된 데이터를 말한다.
예) 사원TB에서 사원들 사이의 상하위 관계, 조직TB에서 조직들 사이의 상하위 관계
순방향 : 부모 → 자식 (PRIOR 자식 = 부모)
vs. 역방향 : 자식 → 부모 (PRIOR 부모 = 자식)
Oracle 계층형 질의
START WITH : 계층 구조 전개 시작 위치 지정
ORDER SIBLINGS BY : 형제 노드 사이의 정렬
루트 노드의 Level 값은 0이다.
FROM절에 동일 테이블이 2번 이상 나타난다. 동일 컬럼명이 헷갈리지 않기 위해 Alias를 쓴다.
예) 한 테이블 내에서 두 컬럼이 연관 관계가 있을 때
*나는 한 컬럼의 타입 둘을 각각의 컬럼으로 값 처리?하고 싶어서 썼다.
Block 구조로 되어 있어 기능별로 모듈화 가능
변수, 상수 등을 선언하여 SQL 문장 간 값을 교환
IF, LOOP 등의 절차형 언어 사용
커스텀 에러 정의 사용
PL/SQL, Oracle 지원 서버면 프로그램 이전 가능
응용 프로그램 성능 향상
여러 SQL을 묶어서 Block 전송해서 통신량이 감소

PL/SQL에서 디비 CURSOR를 사용할 때 과정
OPEN → FETCH → CLOSE
특정 테이블에 CRUD 같은 DML문이 수행되었을 때, 디비에서 자동 동작하도록 작성된 프로그램
테이블, 뷰, 디비 작업을 대상으로 정의
사용자가 호출 X, 디비 자동적으로 수행한다.
프로시저와 트리거의 차이점 : 프로시저만이 BEGIN ~ END 절 내에 Tx 종료 명령어를 쓸 수 있다.
(COMMIT, ROLLBACK등등)
종류 (내가 썼던 함수들이다)
PERCENT_RANK : 파티션 값 중 제일 늦은 것을 1로 하여 행의 순서별 백분율을 조회
FIRST_VALUE , LAST_VALUE : 각각 파티션에 처음 나온 값, 가장 나중에 나온 값
WHERE절에는 AVG()를 쓸 수 없다.
먼저 WHERE절 조건을 쓰고 GROUP BY + HAVING 조건절을 쓴다. (계산 대상을 줄이는 게 좋아)
트랜잭션에서 ROLLBACK을 하면 그냥 모든 작업이 싹 날라간다.
그래서 SAVEPOINT를 지정하고 ROLLBACK 뒤에 SAVEPOINT를 명시해서 여기까지는 남겨라~
하고 알려주는 것이다.
순수 관계 연산자 종류 : SELECT, PROJECT, JOIN, DIVIDE
오라클에서는 OUTER JOIN 구문을 (+)를 사용해서 처리할 수 있다.
ANSI로 변환하려면 Inner쪽 테이블에 조건절을 ON절에 함께 위치시켜야 정상적인 OUTER JOIN이 수행된다.
UNION : 중복을 제외하고 컬럼이 같은 테이블의 쿼리 결과를 합친다.
UNION ALL : 중복을 포함한다. 중복이 없을 때 UNION과 같은 결과
INTERSECT : 쿼리 결과에 대한 교집합이다. 중복 X
EXCEPT : 쿼리 결과에 대한 차집합니다. 중복 X ( =MINUS )
USING 조건절을 쓴 EQUI JOIN과 NATURAL JOIN은
JOIN 컬럼에 대해서 ALIAS, 테이블 이름 등의 접두사를 쓸 수 없다.
delete table은 테이블 행(데이터)을 모두 삭제한다.
truncate table는 테이블 자체 삭제가 아니다.
단, 테이블 행이 전부 제거되고 기존 저장 공간이 해제된다.
drop table은 테이블을 자체 삭제한다.
SQL 문장을 디비 서버에 저장하여 사용자와 애플리케이션 사이에서 공유할 수 있도록 만든
일종의 SQL 컴포넌트 프로그램이며,
독립적으로 실행되거나 다른 프로그램으로부터 실행될 수 있는 완전한 실행 프로그램이다.
예) Oracle의 저장 모듈(3) : Procedure, User Defined Function, Trigger
| 프로시저 | 트리거 |
|---|---|
| CREATE Procedure 문법 사용 | CREATE Trigger 문법 사용 |
| EXECUTE 명령어로 실행 | 생성 후 자동 실행 |
| COMMIT, ROLLBACK 가능 | COMMIT, ROLLBACK 실행 안됨 |
문제) DML문이 수행 되었을 때, 디비에서 자동으로 동작하도록 작성된 저장 프로그램은?
해시 조인은 조인 컬럼의 인덱스를 사용하지 않는다.
따라서 조인 컬럼의 인덱스가 존재하지 않는 경우에 유용한 조인 기법이다.
해시 함수를 이용해서 조인을 하기 때문에 ‘=’, 즉 등치 조인에서만 사용할 수 있다.
+) 특징
CPU 연산이 많이 발생된다.
조인할 때 선행 테이블의 크기가 작아야 유리한 조인이다.
해시 조인 작업을 위해서 해시 테이블을 메모리에 생성해야 한다.
해시 테이블을 저장할 때 메모리에 적재할 수 있는 영역의 크기보다 커지면 임시 영역(디스크)에 저장한다.
선행 테이블은 BUILD INPUT, 후행 테이블은 PROVE INPUT
전체 데이터 조회의 경우, 인덱스를 쓰지 않는 FTS를 사용한다.
인덱스는 조회만을 위한 오브젝트다. 따라서 삽입, 수정, 삭제의 경우 부하를 가중한다.
Balance Tree는 관계형 디비에서 가장 많이 사용되는 인덱스다.
SQL 처리 흐름도는 SQL 실행계획을 시각화해서 표현한 것이다. 실행 시간을 알 수는 없다.
인터넷 기출 풀었는데 모르겠던 것들
어떤 것, 어떤 것의 성격, 어떤 것의 관계