SQLD 합격 후기 및 자료

TraceofLight·2022년 11월 29일
1

Certificate

목록 보기
1/1

47회 SQL 개발자 자격 시험에 합격했다. 진로를 확실히 비틀어버린 뒤에 처음으로 취득하는 자격증이라 굉장히 뿌듯한 감이 있다.

처음에는 1달 정도를 투자하고 싶었는데 다른 할 일들에 치이거나 너무 이론적으로 접근하는 등.. 시간 낭비를 꽤 많이 한 것 같아서 아쉬운 부분이 있다. 공부하면서 확인했던 점들을 여기에 남긴다.

마지막 파트에 개인적으로 정리한 개념들이 기재되어 있는데 이후에 실전적인 부분이나, 내가 암기하기 편하도록 편집된 점들이 이곳저곳에 남아서 맞지 않는 부분 등이 존재할 수 있다! 그래도 혹시 누군가가 공부할 때에 도움이 될 수 있으니 전체 내용을 남겨두고 나중에 생각나면 편집할 예정이다.

소요 시간 및 공부 방법

실질적으로 소모한 시간은 2주 가량, 문제 풀이에는 1주 가량을 소비했다.

처음에는 Data on Air에서 제공하는 개념 설명을 통해 왕도에 가까운 방향으로 공부를 진행하고 싶었지만 SQLD 자체가 개념적인 부분보다는 실전적인 SQL 구문의 형태로 제공되는 문제 수가 훨씬 많은 것을 보고 초반부에 하차하게 되었다. 하지만 여전히 내용 자체는 좋다고 생각하기 때문에 시간이 많다면 한 번 확인하는 것을 추천한다!

그 다음으로는 유튜브에 존재하는 다양한 형태의 강의를 통해 대략적인 개요를 잡았다. SQLD에 한해서는 꽤 많은 양의 정리된 강의가 존재하고 있기 때문에 좋아보이는 것을 골라잡는 것으로 충분할 것이다.

마지막으로 문제풀이인데 문제의 경우는 관련 카페 혹은 블로그에 기출 문제를 복원해놓은 자료들이 존재한다. 일명 "노랭이" 라고 불리는 책도 좋지만 기출문항에 대한 풀이도 소홀히 하지 않는 것이 중요하다! 노랭이의 경우는 2단원까지 1회독 및 오답 노트 정리만 진행하였고 나머지 시간 동안 전부 기출 문제 풀이에 시간을 사용했다.

개인적으로 추천하는 복원 문제 모음 사이트는 이 블로그를 추천하고 싶다. 답을 입력하는 것으로 즉시 해당 문제의 정오를 확인할 수 있기 때문.

개념 정리

참고사항: 1단원 쪽이 2단원보다 문제 비중이 적어 후순위로 밀렸고 그에 따라 필요한 내용만 기재하여 내용이 충분치 않을 수 있음

1단원

엔터티의 분류

  • 기본 / 키 엔터티
  • 중심 엔터티
  • 행위 엔터티

데이터 모델링

  • 정보 시스템 구축을 위한 데이터 관점의 업무 분석 기법
  • 현실 세계의 데이터를 약속된 표기법에 의해 표현
  • 데이터 베이스를 구축하기 위한 분석 / 설계의 과정

데이터 모델링을 진행할 때의 유의점

  • 중복
  • 비유연성
  • 비일관성

데이터 모델링의 종류

  • 개념적: 추상화 수준이 높고, 업무 중심으로 포괄적 진행
  • 논리적: Key, 속성, 관계 등을 정확하게 표현, 재사용성이 높도록 설계
  • 물리적: 실제 데이터 베이스에 이식할 수 있도록 하며 물리적 성격을 고려합니다.

데이터 베이스 스키마의 구조

  • 외부
  • 개념
  • 내부

ERD 작성 순서

  1. 엔터티를 그린다.
  2. 엔터티를 적절하게 배치한다.
  3. 엔터티 간의 관계를 설정한다.
  4. 관계명을 기술한다.
  5. 관계 참여도를 기술한다.
  6. 관계 필수 여부를 기술한다.

엔터티의 특징

  • 해당 업무에서 필요하고 관리해야 할 정보
  • 유일한 식별자여야 한다.
  • 2개 이상의 인스턴스를 보유한다.
  • 실제로 사용되어야 한다.
  • 속성을 보유해야 한다.
  • 최소 1개 이상의 관계를 형성해야 한다.
1개 엔터티: 2개 이상의 인스턴스 집합 + 2개 이상의 속성
1개 속성: 1개 이상의 속성값

속성의 특성에 따른 분류

  • 기본 속성
  • 설계 속성
  • 파생 속성

도메인

  • 각 속성이 가질 수 있는 값의 범위
  • 엔터티 내 속성에 대한 데이터 타입, 크기, 제약사항 지정

속성 명칭 부여

  • 해당 업무에서 사용하는 명칭이어야 한다.
  • 서술식 속성명은 사용하지 않는다.
  • 약어의 사용을 자제한다.
  • 전체 데이터 모델에서 유일성을 확보해야 한다.

ERD에서는 존재적 관계와 행위적 관계를 구분하지 않는다.
하지만 Class 다이어 그램에서는 구분하며 연관 관계, 의존 관계를 서술해야 한다.

관계의 표기법

  • 관계명: 관계의 이름
  • 관계차수: 1 : 1, 1 : M, M : N
  • 관계선택사양: 필수, 선택

관계 읽기

  • 기준 엔터티를 1개 One 또는 각 Each로 읽는다.
  • 대상 엔터티의 관계 참여도를 읽는다.
  • 관계 선택 사양과 관계명을 읽는다.

식별자 종류

  • 대표성: 주 식별자 vs 보조 식별자
  • 스스로 생성 여부: 내부 vs 외부
  • 단일 속성 식별: 단일 vs 복합
  • 의미 여부: 본질 vs 인조

주 식별자의 특징

  • 유일성
  • 희소성
  • 불변성
  • 존재성

성능 데이터 모델링

데이터 베이스 성능 향상을 목적으로 성능 관련 사항을 데이터 모델링에 반영

1차 정규화 대상

  • 중복 속성에 대한 분리
  • 로우 단위의 중복
  • 칼럼 단위의 중복

반정규화

정규화된 엔터티, 속성, 관계의 중복, 통합, 분리를 통해
시스템의 성능을 향상, 개발 및 운영의 단순화
무결성이 깨질 수 있음에도 성능 저하가 예상될 때 수행한다.

절차

  • 반정규화의 대상 조사
    - 범위 처리 빈도
    - 대량의 범위 처리
    - 통계성 프로세스
    - 테이블 JOIN 갯수
  • 다른 방법으로 진행할 수 있을 경우 해당 방법으로 유도 검토
    - JOIN이 많은 경우 view table 사용
    - 대량의 데이터 처리 시 clustering
    - 대량의 데이터를 보유한 경우 파티셔닝을 통해 데이터 분할
    - index maintenance
    - 응용 application 의 logic 변경

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

개별적으로 발생하는 Transaction -> 개별 테이블
슈퍼 + 서브 타입 -> 슈퍼 + 서브 테이블
전체 -> 하나의 테이블

PK 순서를 결정하는 기준

  • 인덱스를 효율적으로 이용할 수 있도록 지정
  • 앞쪽에 위치한 속성의 값이 비교자일 것
  • 가급적 '=', BETWEEN, '<>'

분산 데이터 베이스 장점 및 단점

  • 장점

    	- 지역 자치성, 점진적으로 시스템의 용량 확장이 가능
    	- 신뢰성과 가용성 / 효용성과 융통성
    	- 빠른 응답 속도, 통신 비용의 절감, 지역 사용자의 요구 수용 증대
    	- 데이터의 가용성과 신뢰성 증가, 시스템 규모 조절
  • 단점

    	- 개발 비용 및 오류 잠재성 증가, 처리 비용 증가, 데이터의 무결성을 위협
    	- 설계 과정의 어려움, 관리의 복잡성과 비용, 불규칙한 응답속도, 통제의 어려움

2단원

SQL문의 종류

DCL

Data Control Language, 권한을 관리하는 명령어

  • GRANT

    • 권한을 부여하는 역할

    • GRANT {permission} ON {table} TO {user};의 형태로 사용

      WITH GRANT, WITH ADMIN의 비교
      
      GRANT: 특정 사용자에게 권한 부여가 가능한 권한을 부여, 부여한 부모의 권한이 회수될 때 자식의 권한도 회수
      ADMIN: 테이블에 대한 모든 권한을 부여, 부여한 부모의 권한 회수와 관계 없는 권한
  • REVOKE

    • 권한을 회수하는 역할
    • REVOKE {permission} ON {table} FROM {user};의 형태로 사용
  • 권한의 종류

    ALL -- 모든 권한 부여
    SELECT INSERT UPDATE DELETE /*  */
    REFERENCES ALTER INDEX /*  */
    
    /* ROLE: 다양한 권한을 하나의 그룹으로 묶어서 관리 */
    CREATE ROLE {role_name}; -- 권한 그룹 생성
    GRANT {permission_type} TO {role_name}; -- 해당 그룹에 권한 등록
    GRANT {role_name} TO {user_1}, {user_2}...; -- 다른 유저들에게 권한 그룹 부여

DDL

Data Definition Language, 데이터를 정의하는 명령어

SQL Server 기준으로 Auto Commit을 지원

  • CREATE

    • 테이블 구조 생성

    • CREATE TABLE {table_name} {table_elements}; 의 형태로 사용

      CREATE TABLE EXAMPLE (
      /* 
        컬럼명은 영어, 한글, 숫자 전부 가능 
        첫 글자를 문자로 지정해야 하며, 컬럼의 데이터 타입은 반드시 설정해야 한다.
      */
      		NAME  varchar2(max_length)  -- 최대 길이를 가진 가변길이 문자열
        	ID번호 char(length)          -- 고정된 길이 문자열
      		나이_2 number(max_length)    -- 숫자형 데이터 타입
        	생일   date                  -- 날짜형 데이터 타입
      );
    • CONSTRAINT (조건)
      • default: 기본값 지정
      • not null: null 입력 불가
      • primary key: 기본키 지정 (not null, unique, 다수 가능)
      • foreign key: 외래키 지정 (다수 가능)
  • ALTER

    • 테이블 및 컬럼에 대해 이름과 속성의 변경, 추가, 삭제 등의 구조 수정 역할

    • ALTER TABLE {table_name} {detail_order} {detail_property(if need)} TO {change_target}; 의 형태로 사용

    • 세부 명령어

      • RENAME: 테이블, 컬럼의 이름을 변경
      • MODIFY: 컬럼의 속성을 변경
      • ADD: 컬럼을 추가
      • DROP: 컬럼을 제거
      • ADD CONSTRAINT / DROP CONSTRAINT: 제약조건을 추가, 제거
  • RENAME

    • 테이블, 컬럼의 이름을 ALTER를 거치지 않고 변경할 수 있음
    • 다수의 테이블명을 동시에 변경 가능
  • DROP

    • 테이블, 컬럼을 ALTER를 거치지 않고 제거할 수 있음

    • TABLE {table_name} CASCADE CONSTRAINT

      • Oracle에만 존재하는 옵션으로, SQL Server에는 존재하지 않음
      • FK 제약조건, 참조 테이블을 먼저 제거하고, 해당 테이블을 삭제한다.
      • 해당 테이블의 데이터를 외래키 참조 제약사항도 모두 제거
  • TRUNCATE

    • 테이블 초기화 (삭제가 아님!)

    • 내부 데이터만 제거되고 테이블의 존재 및 컬럼은 남는다.

    • DROP vs TRUNCATE vs DELETE

      • DROP: 테이블을 통째로 제거 후 메모리 release
      • TRUNCATE: 테이블, 컬럼의 존재가 남고 나머지 데이터에 대한 메모리 release
      • DELETE: 레코드를 제거, 데이터에 대한 로그가 남아 반영 전까지 롤백이 가능하고 메모리 release 없음

DML

Data Manipulation Language, 레코드를 조작하는 명령어

  • INSERT

    • 데이터를 레코드에 입력
    • INSERT INTO {table_name} {column_name} VALUES {change_column_name}; 의 형태로 사용
    • 칼럼명 지정을 안하고도 입력이 가능하지만 지정하지 않은 경우 모든 값이 입력되어야 한다.
  • UPDATE

    • 기존 데이터를 수정
    • UPDATE {table_name} SET {column_name} = {column_value} WHERE {condition}; 의 형태로 사용
  • DELETE

    • 기존 데이터를 제거
    • DELETE FROM {table_name} WHERE {condition}; 의 형태로 사용
    • FROM 생략 가능
  • SELECT

  • 특정 데이터를 조회

  • SELECT {select_target} FROM {select_origin} WHERE {condition}; 의 형태로 사용

  • GROUP BY {calc_type} HAVING {condition} / ORDER BY {sort_condition} 의 형태로 조건을 넣기도 함

  • DISTINCT

    중복값 없이 조회하는 조건 (a, b, NULL, a, b, NULL) => (a, b, NULL)

  • COUNT

    (*): 전체 행의 수를 NULL 값을 포함하여 카운팅

    ({column_name}): 특정 컬럼의 행값을 NULL을 제외하고 카운팅

TCL

Transaction Control Language, Transaction 제어 명령어

Transaction: DB의 상태를 변화시키는 작업

* transaction의 특징
고립성: 실행되는 동안 다른 transaction에 영향을 받아 잘못된 결과를 만들면 안됨
일관성: 실행 전 데이터베이스에 잘못된 점이 없다면 transaction 수행 후에도 내용에 오류가 있으면 안됨
지속성: transaction이 갱신한 데이터베이스 내용은 영구적으로 저장
원자성: transaction에서 정의한 연산은 모두 성공적으로 실행되거나 전혀 실행되지 않음 (All or Nothing)
  • COMMIT

    • 데이터에 대한 변화를 DB에 반영
  • SAVEPOINT

    • 코드 분할의 분기점이 될 수 있도록 savepoint를 지정
    • SAVEPOINT {savepoint_name}; 의 형태로 사용
  • ROLLBACK

    • 이전의 상태로 되돌리는 명령어
    • SAVEPOINT 혹은 직전 COMMIT으로 되돌리기가 가능
    • ROLLBACK TO {rollback_point}; 의 형태로 사용
    • SAVEPOINT가 없다면 가장 최신의 COMMIT으로 복원
  • TCL의 효과

    • 데이터 무결성의 보장
    • 영구적 데이터 변경 전 데이터의 변경사항을 확인
    • 논리적 연관성이 있는 작업들을 그룹화 처리 가능

함수

문자형 함수

SELECT, WHERE 등의 조건을 지정할 때 많이 사용

  • LOWER

    • 영어 문자열을 소문자로 변환
  • UPPER

    • 영어 문자열을 대문자로 변환
  • CONCAT

    • 문자열 2개를 결합
    • Oracle '||', SQL Server '+' 동일한 역할
  • SUBSTR

    • 문자열 M번째에서부터 N개의 문자를 남기고 제거
  • LENGTH, LEN

    • 공백을 포함한 문자열의 길이
  • TRIM, LTRIM, RTRIM

    • 양 끝단의 지정된 문자를 모두 제거, 지정된 문자가 없다면 공백을 제거

숫자형 함수

  • ROUND

    • 반올림
  • TRUNC

    • 버림
  • CEIL

    • 크거나 같은 최소 정수
  • FLOOR

    • 작거나 같은 최대 정수
  • MOD

    • 모듈로 연산
  • SIGN

    • 양수는 1, 0은 0, 음수는 -1을 반환
  • ABS

    • 절댓값

날짜형 함수

  • SYSDATE

    • 쿼리를 실행 중인 현재의 날짜 및 시간을 출력
  • EXTRACT

    • EXTRACT ({information} FROM {data}) 의 형태로 사용
    • 날짜형 데이터에서 원하는 값을 추출하는 법

형 변환

해당 함수들을 통해 데이터 타입을 변경할 수 있다

  • TO_NUMBER

    문자열 > 숫자

  • TO_CHAR

    숫자, 날짜 > 문자 (포맷에 따라서 다르게 생성)

  • TO_DATE

    문자열 > 날짜 (포맷에 따라서 다르게 생성)

기본 구조

  • DECODE

    • IF문
    • 조건이 심플하게 정리될 때
  • CASE WHEN

    • 길어진 IF문
    • 조건의 정리가 길게 필요할 때
  • ORDER BY

    • 조회된 테이블의 정렬
    • 기준을 여러 개 사용할 수 있음
  • WHERE

    • IN, NOT IN: 목록 내의 값들 중 어느 하나만 일치, 불일치한다면 조건을 만족
    • IS NULL, IS NOT NULL: NULL인지 아닌지 판단해서 T / F
    • BETWEEN a AND b: a와 b 사이에 값이 존재하는지 확인해서 T / F 반환 (a와 b를 포함)
    • 비교 연산자: =, >, <, >=, <= 등
    • A LIKE B: a에 대하여 b와 유사한 문자열을 찾아줌
    • %: 문자 1개 이상이 존재한다는 의미
    • _: 문자 1개
    명시적 형변환 vs 암시적 형변환
    
    명시적 형변환: 함수를 활용하여 데이터 타입을 변경
    암시적 형변환: 데이터베이스가 알아서 바꿔주는 것
    >> 숫자 타입의 PK는 암묵적으로 인덱스가 되는데 데이터의 조회 등으로 암시적 형변환이 발생한 경우, 인덱스로 사용이 불가능
  • WITH

    • 서브 쿼리를 사용해서 임시테이블, view처럼 사용 가능
    • 별칭 지정 가능
    • 인라인 뷰 혹은 임시테이블로 판단
    • WITH {table_name} AS {table_condition} 의 형태로 사용
  • GROUP BY

    • 조건에 따라서 grouping 진행하는 명령어
    • 값의 조합이 다르다면 다른 그룹
  • HAVING

    • grouping 이후 상태 기반의 조건문
    • COUNT(카운팅), SUM(합), AVG(평균), MAX(최대), MIN(최소), STDDEV(표준편차), VARIAN(분산) 등
    • DISTINCT(중복 제거), ALL(전체) 등의 조건을 사용할 수 있음

NULL 함수

  • NVL, ISNULL

    • NULL이면 다른 값으로 변경하는 함수
    • 데이터 타입이 다르면 사용할 수 없음
  • NVL2

    • NULL인지 아닌지에 따라서 다른 결과를 반환하는 함수
    • NULL이 아닐 경우 1번 파라미터, NULL인 경우 2번 파라미터를 반환
  • NULLIF

    • 파라미터 2개가 같을 경우 NULL을 반환, 다를 경우 1번 파라미터를 반환
  • COALESCE

    • NULL이 아닌 최초의 값을 반환

GROUP 함수

그룹 대상 컬럼값, 집계 대상 컬럼값은 NULL로 출력

일반 그룹함수로 동일한 결과를 추출할 수 있음

  • ROLLUP

    • 부분합과 전체합을 보여준다.
    • 함수의 인자가 주어진 순서에 따라 결과값이 달라지며 계층 구조로 집계값을 반환한다.
  • CUBE

    • 그룹화할 수 있는 모든 경우에 대해서 인자합을 생성
  • GROUPING SETS

    • 괄호로 묶은 집합별 집계가 가능
  • GROUPING

    • 소계, 합계 등이 계산되면 1을 반환, 아니라면 0을 반환하는 함수

JOIN

일반적으로 테이블 간의 결합, 집합과 유사

테이블과 테이블, 조인 결과와 테이블, 조인 결과끼리의 JOIN이 가능

관련된 두 테이블에 적어도 하나의 공통 속성이 존재할 때 적용 가능

JOIN을 명시하는 ANSI 표준형 쿼리가 있고 그렇지 않는 비표준형 쿼리가 존재한다.

JOIN이 나열된 경우 한 번에 2개씩 작업, 모두 동시에 작업 불가능

  • 교집합

    • INNER JOIN

      • 비표준형 표기 , 로 축약
      • 양쪽 테이블의 교집합을 JOIN
    • LEFT JOIN

      • 비표준형 사용 시 왼쪽에 (+) 표기
      • 왼쪽 테이블에서 전부, 오른쪽 테이블에서 교집합만 JOIN
    • RIGHT JOIN

      • 비표준형 사용 시 오른쪽에 (+) 표기
      • 오른쪽 테이블에서 전부, 왼쪽 테이블에서 교집합만 JOIN
    • OUTER JOIN

      • 양쪽에 (+) 사용 불가로 OUTER JOIN을 사용할 수 없으므로 ANSI 표준형 쿼리를 사용해야 한다.
      • UNION과 다르게 공통 속성이 1개만 존재해도 적용이 가능하다.
  • 합집합

    • UNION (ALL)

      • 조회대상 컬럼의 수가 같고 각 컬럼의 속성이 동일할 때 적용할 수 있는 결합 방식
      • 데이터의 양이 Data1 + Data2가 된다.
      • UNION ALL은 중복 데이터를 제거하지 않고 합치게 됨
  • 차집합

    교집합을 배제하는 하나의 집합만 확인하려고 할 때 적용 가능

    • MINUS(Oracle)

    • EXCEPT(SQL Server)

  • 결합되는 대상 간의 일치 정도

    • EQUI JOIN: 동일한 컬럼을 사용하여 두 Relations을 결합

    • non-EQUI JOIN: 정확하게 일치하지 않는 컬럼들을 사용하여 두 Relations을 결합

      ex) A.key <, >, <=, >= B.key
  • CROSS JOIN

    • Key 없이 JOIN하면 두 테이블에 대해 Cartesian Product 발생

      5개의 행 * 3개의 행 = 15개의 행으로 조회
  • SELF JOIN

    • 한 테이블 내에서 연관관계를 가진 두 컬럼 간의 JOIN
    • 테이블명 및 컬럼명이 모두 일치하기 때문에 ALIAS 사용 필수
  • Optimizer Join

    • JOIN을 수행하는 과정에서 성능 최적화를 위한 방식 선택, Hint로 기입

계층형 조회

트리 형태의 데이터에 대해 조회를 수행하는 것

  • 계층 구조의 시작점은 START WITH로 설정(ROOT NODE)

  • 자식 노드가 없는 노드 = LEAF NODE

  • 계층을 LEVEL로 표기

  • CONNECT BY

    • 계층 구조가 연결된 방향성을 확인

      • 자식 > 부모
      • 부모 > 자식
    • CONNECT BY PRIOR a = b
      • a 컬럼과 b 컬럼이 동일한 레코드 간 계층화 발생
      • b -> a 순으로 재배치
  • SIBLINGS BY

    • 자매 노드들 간의 배치 순서를 결정

WINDOW 함수

레코드 사이의 관계를 쉽게 정의하기 위한 함수

SELECT WINDOW_FUNCTION {arguments} OVER {partition by column} {order_style} FROM {table}; 의 형태로 사용

  • WINDOW_FUNCTION

    • 윈도우 함수

      • 그룹 내 집계함수: COUNT, SUM, MIN, MAX, AVG 등

      • 그룹 내 순위함수

        순위함수를 만들더라도 자동으로 sorting 하지 않기 때문에 ORDER BY 절을 활용해야 한다.

        • RANK
          • 동일한 순위에 대해 동일한 순위 부여
          • 동일한 순위를 하나의 건수로 계산하지 않음
        • DENSE_RANK
          • 동일한 순위에 대해 동일한 순위 부여
          • 동일한 순위를 하나의 건수로 계산
        • ROW_NUMBER
          • 동일한 순위에 대해 고유 순위 부여
      • 그룹 내 비율 관련 함수

        • PERCENT_RANK
          • 값이 아닌, "순서"를 대상으로, 파티션 내에서의 순서별 백분율을 조회함
        • NTILE(n)
          • 파티션 별로 전체 건수를 n등분한 값을 반환
        • CUME_DIST
          • 파티션 내 전체에서 현재 행의 값 이하인 레코드 건수에 대한 누적 백분율을 조회
          • 누적 분포 상에서 0 ~ 1 값을 가짐
      • 그룹 내 행 순서 함수

        • FIRST_VALUE
          • 파티션 내에서 가장 처음 나오는 값 반환
        • LAST_VALUE
          • 파티션 내에서 가장 마지막에 나오는 값 반환
        • LAG(column_name, record_difference)
          • 이전 행을 가져온다
        • LEAD(column_name, record_difference, value_if_null)
          • 다음 행을 가져온다.
          • DEFAULT = 1
  • ARGUMENTS

    - 인수(컬럼명 등 함수의 작업이 이뤄지는 대상)
  • PARTITIAN BY

    • 테이블의 레코드를 쪼개는 기준
  • ORDER BY

    • 쪼개진 레코드들 내에서 혹은 전체 테이블에서 레코드들을 어떤 기준으로 정렬할지 지정
  • WINDOWING

    • 함수의 연산 대상이 되는 레코드의 범위를 정함

      • RANGE
        • 범위 지정 시 사용
      • BETWEEN a AND b
        • a부터 b까지 적용
      • UNBOUNDED PRECEDING
        • 시작 위치 = 첫 번째 행
      • UNBOUNDED FOLLOWING
        • 시작 위치 = 마지막 행
      • CURRENT ROW
        • 시작 위치 = 현재 행

테이블 파티션

대용량의 테이블을 여러 개의 데이터 파일에 분리하여 저장하는 것

물리적으로 분리된 데이터 파일에 저장 => 성능 향상 및 독립적 관리 가능

조회의 범위를 줄이는 효과 => 성능 향상

  • RANGE PARTITION

    • 값의 범위를 기준으로 파티션을 나눠 저장하는 방법
  • LIST PARTITION

    • 특정 값을 기준으로 분할
  • HASH PARTITION

    • 데이터베이스 관리 시스템이 자체적으로 해시함수를 사용해 분할하고 관리하는 방식

Optimizer

같은 SQL문이더라도 어떻게 실행하느냐에 따라서 성능이 달라짐 (성능의 지표: 소요시간, 자원사용량 등)

따라서, SQL문을 분석하여 일정 기준에 따라서 실행 계획을 세울 필요가 있으며 이 때 옵티마이저를 사용한다.

옵티마이저는 실행 성능에 영향을 줄 수 있지만 결과값은 달라지지 않는다.

SQL문 작성 => 파싱 (문법 검사, 구문 분석) => 옵티마이저 (비용 기반 / 규칙 기반) => 실행 계획 (PLAN_TABLE 저장) => SQL 실행
  • 비용 기반

    • 최신 Oracle 기준 비용 기반 Optimizer를 기본값으로 사용
    • 시스템 통계와 오브젝트 통계를 통해 해당 SQL문 실행에 대한 총 비용을 계산 후 최소 비용 실행 계획을 수립
  • 규칙 기반

    • 15가지 우선순위를 기준으로 실행 계획을 수립
    • 일반적으로 ROWID를 기반으로 스캔하는 것이 가장 우선순위가 높음
  • INDEX

    • 인덱스 키를 기준으로 정렬 => 탐색이 빨라짐

    • PK는 자동적으로 INDEX가 됨

    • 하나의 테이블에 여러 개의 인덱스를 생성할 수 있으며, 하나의 인덱스가 여러 컬럼으로 구성될 수 있음

    • 내림차순으로 생성 및 정렬됨

    • 자주 변화하는 속성을 인덱스로 설정하는 것은 좋지 않음

    • 보조 인덱스에는 UNIQUE 속성의 인덱스가 아니라면 중복 데이터의 입력이 가능하다.

    • 인덱스 스캔보다 전체 스캔이 더 효율적이고 비용 기반으로 유리할 수 있음

    • 파티션 테이블은 파티션에 대해 파티션 키 인덱스를 생성 가능, Global 인덱스라고 부름

    • 인덱스가 늘어나면 당연히 데이터의 증가이므로 입력, 삭제, 수정 속도의 하락을 불러올 수 있음

    • 모든 데이터 타입으로 인덱스 형성이 가능

    • 인덱스의 종류로 순차 인덱스, 비트맵, 결합 인덱스, 클러스터, 해시 인덱스가 존재한다.

    • SCAN 방식

      • Index Unique SCAN
        • 인덱스 키 값이 중복되지 않을 때 해당 키를 통해 탐색
      • Index Unique SCAN
        • 특정 범위를 조회하는 WHERE 문을 사용하여 해당 영역을 스캔
        • 범위에 따라서 단수 혹은 0개의 결과 출력도 가능
      • Index Full SCAN
        • 인덱스의 처음부터 끝까지 모두 스캔
  • Optimizer Join의 종류

    • Nested Loop JOIN

      • 외부(선행, Driving) 테이블을 먼저 조회하여 연결 대상 데이터를 찾고, 내부(후행) 테이블을 연결
      • 선행 테이블의 처리 범위에 따라 처리량이 결정, 따라서 선행 테이블의 크기가 작은 것을 찾을 필요 존재
      • Row 간 처리, Table 간 처리 모두 순차적으로 발생
      • 최적의 순서를 찾아주는 것이 중요
      • Random Access가 발생하기 때문에 (선행 테이블에서 두 번째 테이블을 참조할 때 발생) 성능 지연을 감소시키기 위해 Random Access 발생이 적도록 해야 함
      • 선행 테이블 처리 범위가 넓거나, Random Access 범위가 넓은 경우 SORT MERGE JOIN보다 불리해지는 케이스 존재
      • "INDEX 필수", Unique INDEX 시 유리
      • OnLine Transaction Processing(OLTP)에 유용함
      • 중첩된 반복문과 동일한 형식, 선행 테이블의 조건을 만족하는 경우의 수만큼 반복적 수행
    • Sort Merge JOIN

      • 두 테이블을 각각 정렬하고, 완료되면 병합
      • 정렬이 발생하기 때문에 데이터 양이 많을 경우 느려진다.
      • 정렬 대상 데이터 양이 많을 경우 임시 디스크를 사용하기 때문에 성능 저하가 발생한다.
      • EQIU JOIN, non-EQIU JOIN 모두 가능
    • HASH JOIN

      • 두 테이블 중 작은 테이블을 HASH 메모리에 로딩, 두 테이블의 JOIN 키를 사용하여 해시 테이블 생성

      • 두 테이블을 동시에 스캔

      • 선행 테이블에는 "작은 데이터"가 먼저 와야 함

      • 시스템 자원을 최대한 활용 가능, 자원을 너무 많이 사용할 수 있으며 부하 등의 우려 존재

      • 대용량 처리에 빠른 처리 속도를 보임

      • EQUI JOIN에서만 가능

      • INDEX를 사용하지 않음

      • JOIN 방식

        먼저 선행 테이블을 결정, 선행 테이블에서 주어진 조건에 해당하는 레코드를 선택
        해당 행이 선택되면 JOIN Key를 기준으로 해시 함수를 사용
        해시 테이블을 메인 메모리에 생성, 후행 테이블에서 주어진 조건을 만족하는 행을 찾음
        후행 테이블의 JOIN Key를 사용해서 해시함수를 적용, 해당 버킷을 검색

PL/SQL

SQL을 확장시켜 다양한 절차적 프로그래밍을 가능하게 한 언어

  • Block 구조로 되어있어서 기능별로 모듈화가 가능
  • Declare 문으로 시작하며, 변수 및 상수를 선언하여 사용 가능
    • DECLARE, BEGIN ~ END는 필수, EXCEPTION은 선택
  • DML, IF, LOOP 등 다양한 절차적 언어를 사용
  • Oracle에 내장되어 있으며 동일한 언어를 사용하는 프로그램과 호환이 가능
  • 응용 프로그램의 성능을 향상시킴
  • Procedure, User Defined Function, Trigger 객체를 작성할 수 있다.
    • Procedure 내부에 작성된 절차적 코드는 PL/SQL 엔진이 처리하고 일반적인 SQL 문장은 SQL 실행기가 처리한다.

분산 데이터베이스

하나의 데이터베이스 시스템(DBMS)이 네트워크를 통해 물리적으로 분리된 데이터베이스들을 제어하는 형태의 DB

  • 성능 향상: 분산 데이터베이스가 병렬 작업을 하기 때문에 속도가 빠름
  • 모듈화가 되어 있어 다른 모듈에 영향을 주지 않고 시스템의 갱신이 가능
  • 분산 데이터베이스 추가를 통한 용량의 확장이 가능
  • 중요 데이터를 보호하기 용이
  • 신뢰성이 높음
  • 관리 및 통제의 어려움
  • 보안관리, 무결성 통제의 어려움
  • 복잡한 구조
메모

count(*): 전체 행의 수를 카운팅, null 포함
count({column_name}) null 을 제외한 행의 수를 카운팅
null: 모르는 값을 상징, 값의 부재를 말함
(null is null) = TRUE
null과의 모든 비교는 null 반환
0 혹은 ' '과 동일한 값이 아님 

서브쿼리: SELECT문 내의 SELECT문이 반복 사용된 쿼리, 단일행 및 다중행으로 구분
- 정렬을 수행하는 ORDER BY를 사용할 수 없다.
- 여러 행을 반환하는 서브 쿼리는 다중 행 연산자를, 단일 행을 반환하는 서브쿼리는 단일 행 연산자를 사용
- 메인 쿼리에서 서브 쿼리의 컬럼을 자유롭게 사용할 수 없음
- EXIST는 True 혹은 False를 반환한다

스칼라 서브쿼리: 한 행과 한 컬럼만 반환하는 서브쿼리
인라인뷰: 서브쿼리가 FROM 절 내에 쓰여진 것

view 테이블
- 사용상의 편의를 위해 사용
- 수행속도의 향상을 위해 사용
- SQL의 성능을 향상시키기 위해 사용
- 임시적인 작업을 위해 사용
- 보안관리를 위해 사용

실행 순서
SELECT ALIAS => FROM => WHERE => GROUP BY => HAVING => SELECT => ORDER BY

조회 행수 제한
몇 번째 행을 조회하는지 부여하는 조건문
ROWNUM {row_number}: Oracle
TOP {row_number}: SQL Server
LIMIT {row_number}: MySQL

ROWID
해당 데이터가 어떤 데이터 파일 상에서 어느 블록에 저장되었는지 알려준다.
데이터베이스에 저장되어 있는 데이터를 구분할 수 있는 유일한 값이다.
ROWID의 번호는 데이터 블록에 데이터가 저장된 순서이다.
테이블에 데이터를 입력하면 자동으로 생성된다.
profile
24시간은 부족한 게 맞다

1개의 댓글

comment-user-thumbnail
2023년 7월 3일

이 글 보고 SQLD 49회 합격했어요!

답글 달기