WorkHard/자격증

[SQLD 개발자] 기출문제 공부(21회)

코딩공대 2023. 2. 22. 22:24
728x90

1. 정규화, 반정규화?

  • 정규화의 장점
    • 테이터베이스 변경 시 이상 현상을 제거할 수 있다.

    • 정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장 시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 된다.

    • 데이터베이스와 연동된 응용 프로그램에 최소한의 영향만을 미치게 되어 응용프로그램의 생명을 연장시킨다.

  • 정규화의 단점
    • 릴레이션의 분해로 인해 릴레이션 간의 JOIN연산이 많아진다.

    • 질의에 대한 응답 시간이 느려질 수도 있다. 데이터의 중복 속성을 제거하고 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화되는 효과가 있다.

    • 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수도 있다.

    • JOIN이 많이 발생하여 성능 저라가 나타나면 반정규화를 적용할 수도 있다.

  • 제1 정규형(1NF)
    • 각 컬럼이 하나의 속성만을 가져야 한다.

    • 하나의 컬럼은 같은 종류나 타입의 값을 가져야 한다.

    • 각 컬럼이 유일한 이름을 가져야 한다.

    • 컬럼의 순서가 상관없어야 한다.

  • 제2 정규형(2NF)
    • 제1 정규형을 만족해야 한다.

    • 모든 컬럼이 부분적 종속이 없어야 한다. 

  • 제3 정규형(3NF)
    • 제2 정규형을 만족해야 한다.

    • 기본키를 제외한 속성들 간의 이행 종속성이 없어야 한다.

  • BCNF(Boyce-Codd Normal Form)
    • 제3 정규형을 만족해야 한다.

    • 모든 결정자가 후보키 집합에 속해야 한다.

  • 제4 정규형(4NF)
    • BCNF를 만족해야 한다.

    • 다치 종속이 없어야 한다.

  • 제5 정규형(5NF)
    • 제4 정규형을 만족해야 한다.

    • 조인 종속이 없어야 한다.

    • 조인 연산을 했을 때 손실이 없어야 한다.

  • 반정규화
    • 디스크 I/O량이 많아 성능 저하될 때.

    • 경로가 너무 멀어 조인으로 성능 저하될 때.

    • 컬럼을 계산하여 읽을 때 성능 저하될 것이 예상될 때.

  • 반정규화의 개념과 특징
    • 시스템의 성능 향상, 개발 및 운영의 편의성 등을 위해 정규화된 데이터 모델을 통합, 중복, 분리하는 과정으로 의도적으로 정규화 원칙을 위배하는 행위 반정규화를 수행하면 시스템의 성능이 향상되고 관리 효율성을 증가시키지만 데이터의 일관성 및 정합성이 저하될 수 있다.

    • 과도한 반정규화는 오히려 성능을 저하시킨다.

    • 반정규화를 위해서는 사전에 데이터의 일관성과 무결성을 우선으로 할지, 데이터베이스의 성능과 단순화를 우선으로 할지를 결정해야 한다.

    • 반정규화 방법에는 테이블 통합, 테이블 분할, 중복 테이블 추가, 중복 속성 추가 등이 있다.

  • 반정규화의 기법
    • 테이블 병합 : 1:1관계 테이블 병합, 1:M관계 테이블 병합, 슈퍼/서브타입 테이블 병합

    • 데이블 분할 : 수직분할, 수평분할

    • 테이블 추가 : 중복테이블 추가, 통계테이블 추가, 이력테이블 추가

2. 분산데이터베이스 설계시

  • 분산테이터베이스의 특징
    • 분산데이터베이스는 데이터의 무결성을 완전히 보장하는 것이 불가능하다.

    • 데이터 조회 성능을 위해서 공통된 속성은 하나의 테이블로 묶을 수 있다.

  • 분산데이터베이스의 장점
    • 지역 자치성, 점증적 시스템 용량 확장

    • 신뢰성과 가용성

    • 효용성과 융통성

    • 빠른 응당속도와 통신비용 절감

    • 데이터의 가용성과 신뢰성 증가

    • 시스템 규모의 적잘한 조절

    • 각 지역 사용자의 요구 수용 증대

  • 분산데이터베이스의 단점
    • 소프트웨어 개발 비용 증가

    • 오류의 잠재성과 처리비용의 증대

    • 설계, 관리의 복잡성 증가

    • 불규직한 응담 소고

    • 통제의 어려움

    • 데이터의 무결성에 대한 위협 증가

3. 스키마 구조

  • 개념 스키마
    • 모든 사용자 관점을 통합한 조직 전체 관점의 통합적 표현이다.

    • 모든 응용시스템이나 사용자들이 필요로 하는 데이터를 통합한 조직 전체의 DB를 기술한 것으로 DB에 저장되는 데이터와 그들 간의 관계를 표현하는 스키마이다.

  • 외부 스키마
    • 사용자 관점을 통합한 표현이다.

  • 내부 스키마
    • 물리적 관점을 통합한 표현이다.

4. ERD에서 Relationship에 표시 되는 것은?

  • 관계명(Membership)
    • Entity간 관계에 맺어진 형태이다.

    • 관계가 시작되는 쪽을 관계시작점이라 칭하며 받는쪽을 관계끝점 이라고 칭한다.

    • 관점에 따라 능동적이거나 수동적으로 명명된다.

  • 관계차수(Degree/Cardinality)
    • 두 Entity간 관계에서 수행되는 경우의 수(1:1, 1:N, N:1)

  • 관계선택사양(Optionality)
    • 관계에서 항상 참여하는지 아니면 참여할 수도 있는지를 나타내는 방법따라 필수참여 관계, 선택참여 관계로 나뉜다.

    • 선택참여관계일 경우 ERD에서 관계를 나타내는 선에서 선택참여하는 Entity쪽에 원을 표시해야한다.

5. 인덱스

  • 외래키가 설계되어 있지만 인덱스가 없는 상태라면 입력/삭제/수정의 부하가 덜 생긴다.

  • 주로 B-Tree 인덱스로 되어 있다.

  • 테이블에 만들 수 있는 인덱스의 수는 제한이 없으나, 너무 많이 만들면 성능 부하가 발생한다.

  • 조회는 일반적으로 인덱스가 있는 것이 유리하다.

6. Row Chaining과 Row Migration

  • Row Chaining
    • 정의 : 하나의 Row를 하나의 블록에 저장할 수 없어서 여러 블록에 걸쳐서 저장하는 현상

    • 특성 : Initial Row Piece(행 조작)와 Row Pointer로 블록 내에 저장됨

    • 문제점 : Row의 정보를 검색하기 위해 하나 이상의 데이터 블록을 Scan해야 하기 때문에 성능이 감소됨

    • 해결책 : 블록의 크기를 크게 만든다.

  • Row Migration
    • 정의 : Update로 인하여 늘어나는 공간을 저장할 공간이 없어서 다른블록으로 Row를 옮기는 현상

    • 특성 : 기존 블록에는 Migration되는 데이터의 Row Header와 블록 주고값을 갖게 되고, 새로운 블록에는 Migration되는 데이터가 저장됨

    • 문제점 : Migration된 Row를 읽기 전에 기존 블록에서 헤더를 통해 Migration된 Row를 읽기 때문에 성능이 감소됨

    • 해결책 : PCTFREE를 크게 설정한다, 객체를 Export하고 삭제한 후 Import한다, 객체를 Migrationg하고 Truncate한다. 

7. UNION

  • 데이터의 중복된 행을 제거하고 정렬한다.

  • 데이터의 중복된 행을 포함하지 않는다.

  • UNION ALL은 합집합이다.

8. 트랜젝션

  • 원자성(Atomicity)

  • 일관성(Consistency)

  • 고립성(Isolation)

  • 영속성(Durability)

9. SQL문

[⏺️]

✿.         ✭.         ❤︎

------------------

데이터 ========

 

  • SELECT ✭, ❤︎ FROM (SELECT ✭, ❤︎ FROM ⏺️ ORDER BY ❤︎ DESC) WHERE ROWNUM = 1;
    • => 맨 끝에 데이터가 추출된다.

  • SELECT ✭, ❤︎ FROM (SELECT , ❤︎ FROM ⏺️ ORDER BY ❤︎ DESC) WHERE ROWNUM > 0;
    • => 밑에서부터 위까지 모든 데이터가 추출된다.

  • SELECT ✭, ❤︎ FROM (SELECT , ❤︎ FROM ⏺️ ORDER BY ❤︎ DESC) WHERE ROWNUM <= 3;
    • => 끝에서 3건의 데이터가 추출된다.

  • SELECT ✭, ❤︎ FROM (SELECT , ❤︎ FROM ⏺️ ORDER BY ❤︎ DESC) WHERE ROWNUM = 2;
    • => 처음 한 건 추출해서 ROWNUM이 2인지 비교한다.

  • NVL(= IS NULL) : A가 NULL이면 B로가고, 아니면 A를 출력

  • COALESCE : NULL이 아닌 최초값 출력

  • NULLIF : A와 B의 값이 같으면 NULL출력, 아니면 A를 출력

  • CASE WHEN A IS NOT NULL THEN A ELSE B END : A가 NOT NULL이면 A출력, 아니면 B를 출력

  • SELECT*FROM ⏺️ WHERE NAME LIKE 'A%' : A로 시작하는 모든 ROW

  • SELECT*FROM ⏺️ WHERE NAME LIKE '%A' : A로 끝나는 모든 ROW

10. Window Finction

  • 행과 행 간의 관계를 정의하기 위해 제공되는 함수

  • 순위, 합계, 평균, 행 위치 등을 조작할 수 있다.

  • GROUP BY 구문과 병행하여 사용할 수 없다.

  • 결과 건수가 줄어들지 않는다.

  • PARTITION 구문과 GROUP BY 구문은 둘 다 파티션을 분할한다는 의미에서는 유사하다.

  • sum, max, min등과 같은 집계 윈도우 함수를 사용할 때 윈도우 절과 함께 사용하면 집계 대상이 되는 레코드 범위를 지정할 수 있다.

 - 윈도우 함수 구조

  • ARGUMENT(인수) : 윈도우 함수에 따라서 0~N개의 인수를 설정한다.

  • PARTITOIN BY : 전체 집합을 기준에 의해 소그룹으로 나눈다.

  • ORDERED BY : 어떤 항목에 대해서 정렬한다.

  • WINDOWING : 행 기준 범위를 정한다, ROWS는 물리적 결과의 행 수 이고 RANGE는 논리적인 값에 의한 범위이다.

 - WINDOWING

  • ROWS : 부분집합인 윈도으 크기를 물리적 단위로 행의 집합을 지정한다.

  • RANGE : 논리적 주소에 의해 행 집합을 지정한다.

  • BETWEEN ~ AND : 윈도우의 시작과 끝 위치를 지정한다.

  • UNBOUNDED PRECEDING : 윈도우 시작 위치가 첫 번째 행임을 의미한다.

  • UNBOUNDED FOLLOWING : 윈도우 마지막 위치가 마지막 행임을 의미한다.

  • CURRENT ROW : 윈도우 시작 위치가 현재 행임을 의미한다.