DDL (Data Definition Language) : 데이터 정의어
CREATE, ALTER, DROP, RENAME
데이터베이스 객체(table, view, index...)의 구조를 정의 (생
성, 변경, 제거)
DML (Data Manipulation Language) : 데이터 조작어
INSERT, SELECT, UPDATE, DELETE
데이터베이스 테이블의 레코드를 CRUD (Create, Read, Update, Delete)
DCL (Data Control Language) : 데이터 제어어
GRANT, REVOKE
데이터베이스와 그 구조에 대한 접근 권한을 제공하거나 제거
TCL (Transaction Control Language) : 트랜잭션 제어어
COMMIT, ROLLBACK, Savepoint
DML 명령문으로 수행한 변경을 관리 (트랜잭션 관리)
정규화 목적
-데이터 생성, 수정, 삭제시 데이터 중복, 불일치 등 갱신 이상을 없애기 위해서
-데이터베이스의 성능을 높이기 위해
(테이블을 분해해서 중복되는 열을 제거하기 때문에 메모리를 절약할수 있음)
(https://mangkyu.tistory.com/110)
테이블 컬럼이 원자값(하나의 값)만 갖도록 분해.

1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 분해.
(기본키의 부분집합이 결정자가 되어선 안된다.)

제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 분해
(A->B, B->C일때, A->C)
이렇게 안하면 B를 바꿨을때 C도 바꿔줘야 하는 불필요한 작업이 일어남

제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 분해

1) DB설계 튜닝 (모델링 관점)
데이터 모델링, 인덱스 설계
2) DBMS 튜닝 (환경 관점)
메모리나 블록 크기 지정, CPU 메모리 I/O 관점
3) SQL 튜닝 (App 관점)

https://mangkyu.tistory.com/96
랜덤 액세스가 빈번하거나, 다른 테이블과 순차적 조인이 발생되는 테이블 순서로 데이터 조회가 필요한 테이블에 인덱스를 적용
가능한 한 수정이 빈번하지 않고, ORDER BY/ GROUP BY/ UNION이 빈번한 컬럼을 선정
Q. 인덱스와 테이블 데이터의 저장곤간이 분리되도록 설계하는 이유
=> 데이터 저장시 인덱스의 영향을 받지 않아 빠르기 때문에 저장공간을 분리하여 설계
해시 테이블
해시테이블로 구현할 경우 검색에 대하여 시간복잡도 O(1)을 갖는다. 즉, 빠른 검색이 가능하다.
하지만 해시는 등호(=) 연산자에 적합하고 실제 데이터베이스에서 자주 일어나는 부등호(<, >) 연산에는 적합하지 않다.
B+트리

같은 레벨의 노드들은 이중 연결리스트로 연결되어 있기 때문에 부등호를 사용한 순차검색에 최적화 되어있다.
원하는 데이터를 얻기 위해 리프노드까지 가야만한다는 단점이 있지만, 해시 인덱스에 비하여 인덱싱에 더 알맞은 자료구조로 여겨진다.
검색에 있어 시간복잡도 O(log2 n) 을 갖는다.
JOIN 처리가 없기 때문에 스케일 아웃을 통한 노드확장이 용이하다. 또한 가변적인 데이터 구조로 데이터를 저장할 수 있어 유연성이 높다.
비정형 데이터 혹은 많은 양의 로그를 수집해야할 때 적합
NoSQL에서는 정규화 과정이 필요하지 않다.
RDB와 달리 NoSQL에서는 쿼리의 효율성을 극대화하기 위해 오히려 비정규화한다.
정규화는 중복을 줄이지만 그만큼 다수의 JOIN 을 요구하는 등 성능에 악영향을 미칠수도 있다.
NoSQL에서는 의도적으로 중복을 허용하여 성능적인 이점을 얻는다.
관계형 DB (mysql,oracle).. 행과 열 , 트랜잭션 (ACID)
특징
트랜잭션(전부 아니면 무): 전체 트랜잭션이 하나의 단위로 기록. 실패 시 전체 롤백
정규화: DB설계 시 중복을 최소화해서 구조화하는 프로세스
장점
데이터의 성능이 일반적으로 좋아 정렬, 탐색, 분류가 빠름
신뢰성이 높아 데이터의 무결성을 보장
정규화에 따른 갱신 비용을 최소화
단점
기존에 작성된 스키마를 수정하기 어려움
데이터베이스의 부하를 분석하기 어려움
빅데이터를 처리하는데 매우 비효율적임.
비관계형 (nosql)
특징
장점
대용량 데이터 처리를 하는데 효율적임.
읽기 작업보다 쓰기 작업이 더 빠르고 관계형 데이터베이스에 비해 쓰기와 읽기 성능이 빠름.
데이터 모델링이 유연함.
뛰어난 확장성으로 검색에 유리함.
최적화된 키 값 저장 기법을 사용하여 응답속도나 처리효율 등에서 성능이 뛰어남.
복잡한 데이터 구조를 표현할 수 있음.
단점
- 쿼리 처리시 데이터를 파싱 후 연산을 해야해서 큰 크기의 document를 다룰 때는 성능이 저하됨.
완전성 보장하기 위해 사용.
A : 원자성 (Atomicity) | 트랜잭션에 해당하는 작업 내용이 (모두 성공했을 시) 모두 반영되거나, (하나라도 실패했을 시) 모두 반영되지 않아야 한다.
C : 일관성 (Consistency) | 트랜잭션 처리 결과는 항상 데이터의 일관성을 보장해야 한다.(ex) 타입이 바뀌면 안된다.
I : 고립성 (Isolation) | 둘 이상의 트랜잭션이 동시에 실행되고 있을 때, 각 트랜잭션은 서로 간섭 없이 독립적으로 수행되어야 한다.
D : 지속성 (Durability) | 트랜잭션이 성공적으로 완료된다면, 그 결과가 데이터베이스에 영구적으로 반영되어야 한다.
트랜잭션에서 원자성은 수행하고 있는 트랜잭션에 의해 변경된 내역을 유지하면서, 이전에 commit된 상태를 임시 영역에 따로 저장함으로써 보장
즉, 현재 수행하고 있는 트랜잭션에서 오류가 발생하면 현재 내역을 날려버리고 임시 영역에 저장했던 상태로 rollback
Hint란 SQL 튜닝의 핵심 부분으로 일종의 지시 구문이다.
오라클 Optimizer에게 SQL문 실행을 위한 데이터를 스캐닝하는 경로, 조인 방법 등을 알려주기 위해 SQL사용자가 SQL 구문에 작성하는 것을 뜻한다.
오라클이 항상 최적의 실행 경로를 만들어 내기는 불가능하기 때문에 직접 최적의 실행 경로를 작성해 주는 것이다.
사용자가 특정 SQL 문장에서 어떤 인덱스가 선택도가 높은지 알고 있는 경우 Optimizer에 의존한 실행 계획보다 훨씬 효율적인 실행 계획을 구사할 수 있다.
Hint를 사용하면 액세스 경로, 조인 순서, 병렬 및 직렬 처리, Optimizer의 목표(Goal) 변경이 가능하다.
데이터 값을 정렬해야 하는 경우, 드라이빙 테이블을 원하는 대로 선정하고자 할 때도 Hint가 사용된다.
모든 Hint의 기본 사용법은 쿼리 서두에 힌트를 명시하는 것이다.
1) 쿼리의 성능을 측정해본다 Explain
2) Join의 순서를 확인해본다. 순서만 바꿔줘도 탐색하는 범위가 달라질 수 있다.
3) STRAIGHT_JOIN. mysql이 내부적으로 join 순서를 바꿔주기에 명시대로 실행
DB 정규화란?
데이터의 중복성을 최소화하고 일관성 등을 보장
역정규화를 하는 이유
DB 연동해서 개발해본 경험 / 속도를 개선해본 경험
DB 튜닝이란? / 해본 경험
데이터베이스 hint?
최적화를 위해
인덱스란?
데이터에 빠르게 접근하기 위해 key,포인터 쌍 구조 사용.
추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조
https://mangkyu.tistory.com/96
commit과 rollback이란?
원자성을 보장하기 위해. 다했으면 commit, 에러가 났으면 Rollback
트랜잭션 사용 이유
완전성 보장하기 위해 사용. 중간에 오류가 나거나 이런 경우 부정합 방지.
ACID 보장
drop, delete와 Truncate 차이점
Delete는 데이터만 지워지고 공간은 유지, 느리다. DML
Truncate는 데이터가 1건도 없는 상태로 모든 데이터 삭제, 컬럼값만 유지. 빠르다 DDL
Drop은 데이터와 테이블 전체 삭제(공간 반납) 빠르다 DDL
https://lee-mandu.tistory.com/476
https://goddaehee.tistory.com/55
참고 자료
https://github.com/Seogeurim/CS-study/tree/main/contents/database