SQLD 후기

jinvicky·2023년 9월 10일

취득 목적

  • 방통대 졸업조건 충족
  • sql 개념이 너무 적다 생각해 개념잡기

6월말부터 출퇴근 시간, 점심시간, 퇴근 후 집에서 하루에 5~10문제, 밀린 날엔 20~30까지도 풀었다.

일단 노베이스로 1회독을 돌렸다(당근 절반 이상 틀렸다ㅋ)

2번째 부터는 챕터별로 끊어서 풀고 속도를 높이고 2번 틀리면 풀이를 외웠다.

답지 해설을 노션에 요약해서 외우고, 구글에 sqld 요약 검색해서 아주 조금씩 일하면서 외웠다.

바깥에서도 다른 블로드들의 후기나 기출문제, 오답노트등을 외웠다.

시험 후기 : 생각보다 많이 어렵다.

물론 60% 이상 맞추면 합격인 비교적 쉬운 자격증이라지만 높은 점수를 원한다면 문제집 1권으로는 어려울 것 같다.

lag(), lead()부분과 connect by prior~ 부분을 많이 버벅였다.

얘가 무슨 아이인지 용어 설명을 읊는 것이 중요한 게 아니라, 예시를 보고 이건 A, 저건 B라고 바로 말할 수 있는 훈련을 하는 게 좋다.

시험 시간은 1시간 반이고 시험은 44 객관식과 6개의 주관식이었다.
조인 문제가 많이 나온다.

학업과 회사와 병행하느라 시간 투자가 적었지만
그래도 문제를 많이 풀고 매칭, 연관 연습을 하는 게 좋았을 거 같다. 후회는 없음.


아래는 공부하면서 오답들을 정리했던 노션 내용이다.

모델링의 특징

  • 추상화 - 현실세계를 일정한 형식에 맞춰서 표현
  • 단순화 - 세계를 제한된 언어와 표기법으로 이해 쉽게 단순하게 표현
  • 정확화 - 애매모호함을 배제

인덱스

  • 자주 변경되지 않는 속성이어야 한다.
  • 기본 인덱스는 NULL일 수 없다.
  • 인덱스는 삽입, 삭제, 갱신 연산 속도를 저하시킨다.
  • 대량의 데이터 추가시, 기존 인덱스를 모두 제거한 뒤 데이터를 추가하고 다시 일괄 추가한다.
  • B 트리는 관계형 디비의 주요 인덱스 구조다.

인덱스 종류

B-TREE 인덱스

브랜치 블록(분기 목적), 리프 블록(인덱스 구성 컬럼 값으로 정렬)으로 구성

OLTP 환경에서 많이 사용

CLUSTERED 인덱스

인덱스의 리프 페이지가 곧 데이터 페이지이다.

리프 페이지의 모든 데이터는 인덱스 키 컬럼 순으로 물리적으로 정렬되어 저장된다.

BITMAP 인덱스

DW와 AD-HOC 질의 환경을 위해서 설계되었다. (시스템 질의를 시스템 구현 시에 모두 알 수 없음)

하나의 인덱스 키 엔트리가 많은 행에 대한 포인터를 저장하고 있는 구조이다.


SQL 오류

오라클 한정으로 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)로 되어 있다면 등급을 가진 데이터만 조회되어야 한다!!!! (직급 없으면 제외)

내장 함수

  • 함수의 입력 행수에 따라 단일행 함수와 다중행 함수로 구분할 수 있다.
  • 단일행 함수는 SELECT, WHERE, ORDER BY, UPDATE의 SET절에 사용 가능하다.
  • 다중행, 단일행 함수 모두 단일값을 반환한다.
  • 1 : M 조인이라 하더라도 M쪽에서 출력된 행이 하나씩 단일행 함수의 입력값으로 사용되므로 사용할 수 있다.
    (M쪽에 다중행이 출력되어도 단일행 함수는 사용할 수 있다는 뜻)

단일행 함수는 다중행을 리턴할 때 사용할 수 없지만,
다중행 함수는 단일행을 리턴할 때 사용할 수 있다.

인라인 뷰(쿼리로 만든 가상 테이블)에서 (년도 등의)조건을 걸었다면
이후 where절의 조건에서는 인라인 뷰의 조건이 필요없다.

ERD와 클래스다이어그램의 차이

클래스다이어그램 : 존재적 관계와 행위에 의한 관계를 연관관계와 의존관계로 표현한다.

ERD : 존재관계와 행위관계를 구분하지 않는다.

속성의 명칭 부여

해당업무에서 사용하는 이름을 부여한다.

서술식 속성명은 사용하지 않는다.

약어사용은 가급적 제한한다.

전체 데이터모델에서 유일성 확보하는 것이 좋다.

테이블 INSERT문에서 삽입 컬럼을 명시하지 않았을 경우 모든 컬럼을 삽입해야 한다.
또한 null 여부를 not null로 지정하지 않으면, 컬럼값을 null 가능으로 지정한다.

Delete/Modify Action

  1. Cascade : Master 삭제 시 Child도 같이 삭제한다.
  2. Set Null : Master 삭제 시 Child 해당 필드 Null
  3. Set Default : Master 삭제 시 Child 해당 필드 Default 값으로 설정
  4. Restrict : Child 테이블에 PK 값이 없는 경우에만 Master 삭제 허용
  5. No Action : 참조무결성을 위반하는 삭제/수정 액션을 취하지 않음

Insert Action

  1. Automatic : Master 테이블에 PK가 없는 경우 Master PK를 생성 후 Child 입력
  2. Set Null : Master 테이블에 PK가 없는 경우 Child 외부키를 Null값으로 처리
  3. Set Default : Master 테이블에 PK가 없는 경우 Child 외부키를 기본값 입력
  4. No Action : 참조무결성을 위반하는 입력 액션을 취하지 않음.
  5. Dependent : Master 테이블에 PK가 존재할 때만 Child 입력 허용한다.

DCL와 TCL

TCL은 트랜잭션 제어어, COMMIT과 ROLLBACK이 있다.

DCL은 데이터 제어어, GRANT와 REVOKE가 있다.

DML은 데이터 조작어, 데이터 CRUD하는 명령어들

DDL은 데이더 정의어, 테이블 CRUD하는 명령어들


1~20

데이터 모델링은 무엇일까?

  • 정보시스템을 구축하기 위한 데이터 관점의 업무 분석 기법
  • 현실세계의 데이터에 대해 약속된 표기법에 의해 표현하는 과정
  • 데이터베이스를 구축하기 위한 분석/설계의 과정
  • 디비 모델링 자체로서 업무를 설명하고 분석하는 부분에서도 중요 의미 가짐

모델링 주의사항 (2번 틀림)

  • 중복성 - 여러 장소에 같은 정보를 저장하지 않아야 한다.
  • 비유연성
    해결 : 데이터 정의와 사용 프로세스를 분리
    해서 데이터나 프로세스와 애플리케이션과 디비의 관계를 약화시킨다.
  • 비일관성 - 데이터 간의 연관된 정보가 있는데 이를 무시하고 데이터가 갱신되는 경우다.
    예: 프로세스, 프로그램과 테이블의 연계성을 높여서 업무 변경에 취약하게 만든다.

엔티티 배치 위치 - 가독성

사람 눈은 왼쪽 → 오른쪽, 위 → 아래로 이동하므로

왼쪽 상단에 가장 중요한 엔티티 배치, 업무 중요 엔티티는 왼쪽 상단 조금 아래쪽 중앙

데이터 모델링 종류 (개념, 논리, 물리)

개념 모델링

추상화 수준이 높고, 업무중심적이고, 포괄적인

논리 모델링

key, 속성, 관계 표현이 정확하고 재사용성이 높은

물리 모델링

실제 디비에 이식할 수 있게 성능, 저장 등 물리 성격을 고려

디비 스키마 구조 3단계 (외부, 개념, 내부)

  • 외부 스키마 - 개별 사용자 관점
  • 개념 스키마 - 모든 사용자 관점
  • 내부 스키마 - 물리적 관점

ERD - 피터첸이 개발

(엔티티) 도출 → 배치 → 관계 설정 → 관계명 기술 과정을 거친다.

엔터티, 인스턴스, 속성, 속성값

  • 1개의 엔터티는 2개 이상의 인스턴스의 집합이다.
  • 1개의 엔터티는 2개 이상의 속성을 갖는다.
  • 1개의 속성은 1개의 속성값을 갖는다.

속성

업무에서 필요한 인스턴스에서 관리하고자 하는 최소의 데이터 단위

*각 엔티티별로 동일한 속성명을 쓰지 않는다 (전체 모델에서 유일성 확보 필요)

존재적 관계와 행위에 의한 관계

ERD는 존재적 관계행위에 의한 관계를 구분하지 않는다.

클래스다이어그램은 위 둘을 구분하여 연관관계의존관계로 표현한다.


엔터티 관계 도출 시 체크 사항

  1. 관심 있는 연관규칙이 둘 사이에 존재?
  2. 정보의 조합이 발생?
  3. 업무기술서, 장표에 관계연결을 가능케 하는 동사가 존재?
  4. 업무기술서, 장표에 관계연결 규칙이 있나?

31~40

성능 DT 모델링

  • 데이터의 증가가 빠를수록 성능개선 비용이 늘어난다
  • 데이터모델은 성능을 튜닝하면서 변경될 수 있다.
  • 분석/설계 단계에서 성능을 고려한 데이터모델링을 수행할 경우
    성능 저하에 따른 Rework 비용을 최소화 할 수 있는 기회를 가지게 된다.

문제 발생 시점의 SQL을 중심으로 집중 튜닝하는 건 성능 모델링과 무관하다.

플젝 초기에 테스트 환경에 트랜잭션을 걸어 성능을 테스트한다.

분석/설계 시 데이터 모델도 구조 바꿔가며, 좋은 성능으로 디자인한다.

반정규화 - 성능을 위한 테이블 합치기

데이터를 중복하여 성능 향상시키기부터

정규화된 데이터 모델에서 중복, 통합, 분리 등을 수행하는 모든 과정을 말한다.

예: 경로가 멀어 조인성능저하, 컬럼 계산해서 읽을때 성능 저하, 조회 시 디스크 I/O 성능 저하

성능 데이터 모델링 과정

  1. 정규화
  2. 디비 용량산정
  3. 디비 트랜잭션 유형을 파악
  4. 반정규화(용량, tx 유형)
  5. 이력모델 조정, PK/FK 조정, 슈퍼타입/서브타입을 조정
  6. 성능관점에서 데이터모델을 검증

정규화는 조회 성능을 높이기 위한 것이다. 항상 성능을 낮추지는 않는다.

1차 정규화의 대상

  • 컬럼 단위 중복
  • 컬럼에 의한 반복적인 속성값을 갖는 형태 (원자성 위배) ⇒ 중복 속성
  • 부분 함수종속의 규칙을 가진다.
  • PK에 대해 반복이 되는 그룹이 존재하지 않는다.
  • 로우단위 중복

성능 데이터 모델링

디비 성능 향상을 목적으로 설계 단계부터 성능 사항을 데이터 모델링에 반영하는 것.


41~50

반정규화란 데이터를 중복하여 성능을 높이는 것이다

개발과 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 디비 모델링 기법이다.

반정규화 하는 이유

  • 데이터 조회 시 디스크 I/O량이 많아서 성능이 저하될 경우
  • 경로가 너무 멀어 조인으로 인한 성능저하가 예상되거나
  • 컬럼을 계산하거나 읽을 때 성능저하가 예상되는 경우

반정규화에는 테이블과 컬럼으로 나눠진다 (이걸 2번 틀렸다..)

테이블의 반정규화

기법 분류반정규화 기법
테이블병합1:1, 1:M, 수퍼/서브타입 테이블 병합 (3가지)
테이블분할수직분할과 수평 분할 (2가지)
테이블 추가중복테이블 추가, 통계테이블 추가, 이력테이블 추가, 부분테이블 추가 (4가지)

컬럼의 반정규화

반정규화 기법
중복컬럼 추가
파생컬럼 추가
이력테이블 컬럼 추가
PK에 의한 컬럼 추가
응용시스템 오작동을 위한 컬럼 추가

반정규화 절차

  1. 반정규화 대상조사
  • 범위처리빈도수 조사
  • 대량의 범위 처리 조사
  • 통계성 프로세스 조사
  • 테이블 조인 개수
  1. 다른 방법유도 검토
  • 뷰(VIEW) 테이블
  • 클러스터링 적용
  • 인덱스 조정
  • 응용 애플리케이션
  1. 반정규화 적용
  • 테이블
  • 속성
  • 관계

테이블추가 반정규화 기법 - 부분 테이블 추가

하나의 테이블의 전체 컬럼 중 자주 이용하는 집중화된 컬럼들이 있을 때 디스크 I/O를 줄이기 위해 해당 컬럼들을 별도로 모아 놓는 반정규화 기법

FK에 대한 속성 추가는 반정규화 기법이 아니다.

데이터 모델링에서 ****관계 연결 시 생기는 자연스러운 현상이다.

반정규화 대상을 다른 방법으로 처리하기

  • 지나치게 조인이 걸려 데이터 조회가 어려우면 VIEW로 해결할 수도 있다.
  • 대량의 데이터나 부분처리 성능 문제는 클러스터링 적용 또는 인덱스 조정으로 성능개선 가능하다.
  • 대량의 데이터는 PK 성격에 따라서 부분적인 테이블로 분리할 수 있다.
    즉, 파티셔닝 기법이 적용되어 성능저하를 방지한다.
  • 응용 애플리케이션에서 로직을 구사하는 방법을 바꿔서 성능을 향상시킨다.

데이터 무결성을 깨뜨리지 않고 데이터 처리 성능을 올리는 방법 : 중복관계 추가

파티셔닝 - 논리 테이블 1개를 여러 물리 테이블로 쪼개는 것

장점

  • 테이블 액세스 향상
  • 데이터 관리방법 개선 가능

슈퍼/서브 타입 데이터모델의 변환기술

트랜잭션이 개별인가 전체인가 슈퍼+서브냐에 따라서 3가지 테이블 구조로 각각 처리된다.

한 테이블에 너무 많은 컬럼이 있다면 tx가 접근하는 컬럼유형을 분석하여 1:1 테이블로 분리한다.

FK 설정

  • 상호간의 조인이 자주 발생하면 fk 제약과 상관없이 조인 성능 향상을 위해 인덱스를 별도 추가하는 것이 좋다.
  • fk제약을 생략해도 데이터의 조인관계를 위해 참조 컬럼에 인덱스를 추가한다.
  • fk 제약은 인스턴스 간의 일관성을 보장하기 위한 DBMS의 지원 기능이다.

분산 데이터베이스

장점

  1. 지역 자치성, 점증적 시스템 용량 확장
  2. 신뢰성과 가용성
  3. 효용성과 융통성
  4. 빠른 응답 속도와 통신비용 절감
  5. 데이터의 가용성과 신뢰성 증가
  6. 시스템 규모의 적절한 조절
  7. 각 지역 사용자의 요구 수용 증대

단점

  1. 소프트웨어 개발 비용
  2. 오류의 잠재성 증대
  3. 처리 비용의 증대
  4. 설계, 관리의 복잡성과 비용
  5. 불규칙한 응답 속도
  6. 통제의 어려움
  7. 데이터 무결성에 대한 위협

위치 투명성 : 데이터 저장 장소 명시가 불필요하며 위치정보가 SYSTEM CATALOG에 유지되어야함.

지역 사상 투명성 : 지역 DBMS와 물리적 DB 사이의 MAPPING을 보장한다.

DML은 절차적과 비절차적으로 나뉜다.

절차적 : What + How vs. 비절차적 : What


한번에 데이터를 조회하려면 엔티티 전체를 통합한 계산된 컬럼을 추가한다.

최근에 변경된 값만을 조회할 경우 과도한 조인으로 성능이 저하된다.

‘=’로 들어온 조건에 해당하는 컬럼이 인덱스의 가장 앞쪽에 위치할 때 인덱스의 이용 효율성이 가장 높다.


NULL의 특성

널 값은 0 또는 공백과 다르다. (각각은 숫자, 하나의 문자로 취급된다.)

테이블 생성시 NOT NULL을 지정하지 않으면 디폴트가 NULL로 설정된다.

널이 포함된 사칙연산은 결과값이 무조건 널이다.

널값과의 비교 연산은 FALSE를 리턴한다.

특정 값보다 작다, 크다 할 수 없다.

결과값이 널이 아닌 값을 원하면 NVL/ISNULL 함수를 사용한다. 숫자면 주로 0, 문자면 의미 없는 문자 ‘X’등으로 치환된다

NULL 관련 함수

  • NVL(P1, P2) , 오라클 함수 ISNULL (P1,P2)

다중 행 함수에 NVL()을 쓰면 부하가 발생 (굳이 이러지 마)

  • SQL Server 함수 : NULLIF(P1, P2), COALESCE(P1, P2)

COALESCE 함수는 첫번째로 NULL이 아닌 값을 반환한다.

널이 아닌 값을 발견하면 바로 그 ROW의 컬럼 등을 반환한다. 뭐 그런~

NULLIF 함수는 두 표현식이 같으면 NULL을, 같지 않으면 첫번째 표현식을 반환한다.

(특정 값을 NULL로 대체하고 싶을 때 사용한다)

SQL Server는 NULL값을 인덱스 맨 앞에 저장하고 Oracle은 맨 뒤에 저장한다.


분모에 0이 들어가는 경우 연산 자체가 에러가 발생한다. 즉 0으로 나누지 말라.

예) 5000/0 ⇒ 에러 발생 (0/300은 0이다)

DBMS 옵티마이저는 FROM 절에 테이블들이 아무리 많아도 2개를 택한다.

연산자의 우선순위

  1. 괄호 내 연산
  2. 부정 연산자 NOT
  3. 비교 연산자 (<, ≤, ≥ 등등)와 SQL 비교 연산자 (BETWEEN a AND b, IN (list), LIKE, ISNULL)
  4. 논리 연산자 AND, OR 순서로 처리한다.

Where절은 어디에 위치할까?

  1. 컬럼명 (조건식 왼쪽)
  2. 비교 연산자
  3. 문자, 숫자, 표현식 (조건식 오른쪽)
  4. 비교 컬럼명 (JOIN 사용시)

GROUP BY

두 가지 이상의 기준으로 GROUP BY 했을 때 표현식으로 데이터를 확인하고 싶다면

  1. ROLLUP() 또는 WITH ROLLUP (PostgreSQL은 전자, MYSQL은 후자)
  2. CUBE()
  3. GROUPING SETS()

(어렵다..)


서브쿼리에서 문제를 엄청 틀렸다ㅋㅋㅋ

서브 쿼리 : sql문 안의 sql문이다.

동작 방식에 따라 비연관 서브쿼리와 연관 서브쿼리로 나뉜다.

  • 비연관 서브쿼리 : 메인쿼리 컬럼을 안 가지는 서브쿼리. 메인쿼리에 값을 제공할 목적으로 주로 쓴다.
  • 연관 서브쿼리 : 메인쿼리 결과의 조건을 서브쿼리가 확인

반환 데이터 형태에 따라 단일 행 서브쿼리와 다중 행 서브쿼리로 나뉜다.

  • 단일 행 서브쿼리 : 실행 결과가 1건 이하, 단일 행 비교 연산자와 함께 사용(기호)
  • 다중 행 서브쿼리 : 실행 결과가 여러 건, 다중 행 비교 연산자와 함께 사용(함수)
  • 다중 컬럼 서브쿼리 : 실행 결과로 여러 컬럼을 반환, 메인쿼리 조건과 비교하려고 사용

다중 행 비교 연산자

  1. IN : 결과값이 하나라도 동일해야 한다.
  2. ANY : 결과값이 하나라도 만족해야 한다.
  3. ALL : 모든 결과값이 만족해야 한다.
  4. EXISTS : 결과값의 존재 여부를 확인한다. (결과가 n개여도 1개가 만족하면 탐색을 멈춘다)

스칼라 서브쿼리 : 1행 1열만 반환하는 서브쿼리, SELECT절에 사용

: 가상의 테이블 FROM에서 쓰는 뷰는 인라인 뷰라고 한다.

서브쿼리 응용 → WITH 뷰 이름 AS (SELECT ~)

메인 쿼리를 작성할 때 서브쿼리에 있는 컬럼을 자유롭게 사용할 수 없다.


집합 연산자

order by는 쿼리 맨 마지막 줄에 한번만!

일반 집합 연산자와 SQL을 비교

  • UNION 연산은 UNION 기능으로
  • INTERSECTION 연산은 INTERSECT 기능으로
  • DIFFERENCE 연산은 EXCEPT(Oracle은 MINUS) 기능으로
  • PRODUCT 연산은 CROSS JOIN 기능으로 구현

계층형 질의(Hierachical Query)

테이블에 계층형 데이터가 존재하는 경우 데이터를 조회하기 위해서 계층형 질의를 쓴다.

계층형 데이터란 동일 테이블에 계층적으로 상위와 하위 데이터가 포함된 데이터를 말한다.

예) 사원TB에서 사원들 사이의 상하위 관계, 조직TB에서 조직들 사이의 상하위 관계

순방향 : 부모 → 자식 (PRIOR 자식 = 부모)

vs. 역방향 : 자식 → 부모 (PRIOR 부모 = 자식)

Oracle 계층형 질의

START WITH : 계층 구조 전개 시작 위치 지정

ORDER SIBLINGS BY : 형제 노드 사이의 정렬

루트 노드의 Level 값은 0이다.


셀프 조인(Self Join)은 통일 테이블 사이의 조인이다.

FROM절에 동일 테이블이 2번 이상 나타난다. 동일 컬럼명이 헷갈리지 않기 위해 Alias를 쓴다.

예) 한 테이블 내에서 두 컬럼이 연관 관계가 있을 때

*나는 한 컬럼의 타입 둘을 각각의 컬럼으로 값 처리?하고 싶어서 썼다.


PL/SQL (절차형 SQL)

Block 구조로 되어 있어 기능별로 모듈화 가능

변수, 상수 등을 선언하여 SQL 문장 간 값을 교환

IF, LOOP 등의 절차형 언어 사용

커스텀 에러 정의 사용

PL/SQL, Oracle 지원 서버면 프로그램 이전 가능

응용 프로그램 성능 향상

여러 SQL을 묶어서 Block 전송해서 통신량이 감소

Untitled

PL/SQL에서 디비 CURSOR를 사용할 때 과정

OPEN → FETCH → CLOSE

Trigger

특정 테이블에 CRUD 같은 DML문이 수행되었을 때, 디비에서 자동 동작하도록 작성된 프로그램

테이블, 뷰, 디비 작업을 대상으로 정의

사용자가 호출 X, 디비 자동적으로 수행한다.

프로시저와 트리거의 차이점 : 프로시저만이 BEGIN ~ END 절 내에 Tx 종료 명령어를 쓸 수 있다.

(COMMIT, ROLLBACK등등)

윈도우 함수 : 여러 행 간의 관계 정의 함수이며, 중첩이 불가능한다.

종류 (내가 썼던 함수들이다)

  • 순위 함수
  • 일반집계 함수 - SUM, COUNT
  • 행 순서 함수
  • 비율 관련 함수

PERCENT_RANK : 파티션 값 중 제일 늦은 것을 1로 하여 행의 순서별 백분율을 조회

FIRST_VALUE , LAST_VALUE : 각각 파티션에 처음 나온 값, 가장 나중에 나온 값

WHERE절에는 AVG()를 쓸 수 없다.

먼저 WHERE절 조건을 쓰고 GROUP BY + HAVING 조건절을 쓴다. (계산 대상을 줄이는 게 좋아)


트랜잭션의 특성

  • 원자성 : tx 연산들은 전부 성공 또는 전부 실패해야만 한다.
  • 일관성 : 실행 전에 문제 없으면, 실행 후에도 문제가 없어야 한다.
  • 고립성 : 실행 도중 다른 tx의 영향을 받으면 안된다.
  • 지속성 : 일단 성공하면 그 결과가 영구 지속되어야 한다.

트랜잭션에서 ROLLBACK을 하면 그냥 모든 작업이 싹 날라간다.

그래서 SAVEPOINT를 지정하고 ROLLBACK 뒤에 SAVEPOINT를 명시해서 여기까지는 남겨라~

하고 알려주는 것이다.

슈퍼/서브 타입 데이터 모델의 변환기술 (1:1 매칭)

  • 개별 발생 TX는 개별 테이블로 구성한다.
  • 슈퍼+서브타입 발생 TX는 슈퍼+서브타입 테이블로 구성한다.
  • 전체가 하나인 TX는 하나의 테이블로 구성한다.

순수 관계 연산자와 SQL 문장 비교

순수 관계 연산자 종류 : SELECT, PROJECT, JOIN, DIVIDE

  • SELECT 연산은 WHERE 절로 구현
  • PROJECT 연산은 SELECT 절로 구현
  • JOIN 연산은 다양한 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 vs. Truncate table vs. Drop table

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문이 수행 되었을 때, 디비에서 자동으로 동작하도록 작성된 저장 프로그램은?


Hash Join

해시 조인은 조인 컬럼의 인덱스를 사용하지 않는다.

따라서 조인 컬럼의 인덱스가 존재하지 않는 경우에 유용한 조인 기법이다.

해시 함수를 이용해서 조인을 하기 때문에 ‘=’, 즉 등치 조인에서만 사용할 수 있다.

+) 특징

CPU 연산이 많이 발생된다.

조인할 때 선행 테이블의 크기가 작아야 유리한 조인이다.

해시 조인 작업을 위해서 해시 테이블을 메모리에 생성해야 한다.

해시 테이블을 저장할 때 메모리에 적재할 수 있는 영역의 크기보다 커지면 임시 영역(디스크)에 저장한다.

선행 테이블은 BUILD INPUT, 후행 테이블은 PROVE INPUT


인덱스

전체 데이터 조회의 경우, 인덱스를 쓰지 않는 FTS를 사용한다.

인덱스는 조회만을 위한 오브젝트다. 따라서 삽입, 수정, 삭제의 경우 부하를 가중한다.

Balance Tree는 관계형 디비에서 가장 많이 사용되는 인덱스다.

  • 대량의 데이터를 삽입할 때는 모든 인덱스를 제거하고 삽입이 끝난 후에 인덱스를 다시 생성하는 것이 좋다.

SQL 실행 계획

SQL 처리 흐름도는 SQL 실행계획을 시각화해서 표현한 것이다. 실행 시간을 알 수는 없다.


인터넷 기출 풀었는데 모르겠던 것들

  • 정규화 단계에서 주식별자와 관련성이 가장 낮은 것은?
    ⇒ 제3정규화 : 주식별자가 아닌 컬럼 간의 종속성
  • 주식별자, 내부 식별자, 외부 식별자 쪽 틀림
  • 비즈니스 프로세스에 의해 만들어지는 식별자 → 본질 식별자
  • ORDER SIBLINGS BY를 수행하면 전체 테이블이 아니라 계층형으로 된 데이터값(특정 컬럼) 기준으로 정렬된다. (전체 테이블 기준이 아니다!)
  • 인덱스 스캔 방식의 종류
    인덱스를 역순으로 탐색하며 최댓값을 쉽게 찾는 건 INDEX RANGE SCAN DESCENDING이다.
  • ORDER BY 뒤의 값 순서의 의미를 모르겠다. 1,2 이런 거 ⇒ 1하고 다음이 2
  • 내가 썼던 게 연관 서브쿼리 메인쿼리가 서브쿼리의 결과를 가지고 수행하는 것.
  • 테이블 컬럼 변경 : ALTER TABLE 테이블 MODIFY 컬럼명 타입
  • 날짜 구할 때 꼭 TO_CHAR()로 형변환을 하고 SELECT 해야 한다.

디비 모델링 3가지 중요 개념

어떤 것, 어떤 것의 성격, 어떤 것의 관계

디비 모델링 3가지 관점

  1. 데이터 관점 (어떤 데이터와 관련이 있나, 데이터 간의 관계는 무엇인가)
  2. 프로세스 관점 (업무가 실제 하는 일, 무엇을 해야 하는지)
  3. 데이터와 프로세스의 상관관점 (업무 처리 방법이 데이터에 어떻게 영향을 미치는지)
profile
개발, 그림, 기록

0개의 댓글