Oracle에서 데이터베이스는 file에 저장된 information로 구성되고 instance에 의해 접근됨.
Instance: data file과 상호작용하는 shared memory area and set of processes
데이터베이스는 table space라고 불리는 한 개 이상의 logical storage unit으로 구성된다. 각 table space는 data file이라 불리는 physical space로 구성된다.
-system table space
-user table spaces
-temporary table space
Table space는 segments를 여러 개 묶어 둔 거고,
Segment는 extent를 여러 개 묶어 둔 것.
Extent는 set of contiguous(연속적인) block들로 구성됨.
Types of Segments
-data segments: for table data
-Index segments: for index
-Temporary segments: for sorting etc.
-Rollback segments: for uncommitted transactions
오라클에서..
CREATE TABLE ~~ STORAGE(~~)
파라미터로 들어가는 건 size of extent와 percentage of space utilization(데이터 얼마나 쓸건지..)
Tables은 partitioned돼서 여러 디스크에 나누어 담아질 수 있음(parallel하게 해서 성능 up)
Table은 index를 가질 수 있음(찾기 더 쉽도록…)
(Big data table의 경우)오라클은 horizontal partitioning을 서포트
-Backup과 recovery과 쉽고 빠르다.
-data warehouse에서 로딩하는 작업이 더 좋아짐
-필요한 조각에 대해서만 쿼리문이 실행되므로 성능이 좋아짐
종류
Range Partitioning: 범위를 정해서 분산시킴
Hash Partitioning: 해시함수에 넣어서 나온 값에 따라 분산시킴
Composite Partitioning: range+hash partitioning
List partitioning: 파티셔닝 할 항목을 관리자가 직접 지정
B-tree indices
dbms에서 가장 일반적으로 쓰이는 인덱스.
Leaf block(하위 블록)은 실제 데이터 레코드로 찾아가기 위한 주소값을 가지고 있다. 102번 블록의 데이터 값을 알고 싶다고 할 때..트리에서 찾아 내려가서 해당 주소값의 테이블을 조회하면 된다. Insert, update, delete가 log(n) 성능으로 동작.
Bitmap indices
Index entry를 사용하기 위해 비트맵을 사용. 공간 절약.
or연산 사용하는 여러 개 where 절이 있을 때 유리
Function-Base Indices
함수의 계산 결과를 인덱스로 쓸 수 있음. 찾는 표현에 해당하는 데이터를 조회하기 좋다. (ex. Upper(name)이 ‘VAN GOGH’인 데이터를 찾는다.)
Join Indices
이름이 같은 칼럼이 없어도 참조해서(?) 사용 가능함
Domain Indices
Oracle에서 native하지 않은(text, images 등) 새로운 인덱스 타입을 개발자가 정의해서 사용할 수 있다. 인덱스 디자이너는 오라클 프로토콜 신경써서 만들어야 함.
brain part of DB
-Execution Methods
-Optimization
-Parallel Execution
-full table scan, index scan, index fast full scan, cluster and hash cluster access
Join -inner join, outer join, semijoins, antijoins (테이블 간의 곱)
(hash join, sort-merge join, nested loop join 중 하나로 평가됨)
Hash join. 해시함수를 실행해서 그걸로 해시테이블처럼 만든다.
sort-merge join. 정렬을 한 다음에 연결고리의 조건으로 merge
nested loop join. 2중 for문 느낌으로…
Query Transformation: 개발자가 작성한 SQL을 옵티마이져가 다른 모습으로 재작성하는 것
Materialized view rewrite
(개발자가 sum 함수 입력했는데 sum값 저장되어 있는 테이블이 있으면 거기서 가져오지 새로 sum을 입력하지 않음) 등이 있다.
Access path selection
Join order, join methods, access path 등을 결정하는 cost-based optimizer. 시간 등등을 비교해서 여러 후보 쿼리문들 중 가장 싼 것을 선택한다.
Work를 여러 프로세스들이 동시에 하게 하면 (multiple processes on a multiprocessor computer) 빠르다.
Parallel full table scan: 몇 개 블록으로 쪼개서 병렬로 스캔 가능.
Parallel update and delete: partition으로 나눠서 병렬 연산 수행 가능
Asymmetric fragment and replicate method: 큰 테이블 A와 작은 테이블 B가 있을 때..
A를 3등분으로 쪼개서 B랑 join하는 연산을 병렬 수행
Partitioned hash join: 각 테이블을 병렬로 스캔하고 join 칼럼에 hash 함수를 적용해서 join을 수행하는 프로세스한테 보냄
Parallel sorts
각자의 range에서 병렬로 sort를 진행한 다음에 합친다.
unit of work performed against the db.
Stages of transaction: start, RW operations, commit(성공) or abort(실패)
Transaction은 ACID property를 가짐.
A: Atomicity (All or nothing. 다 실패하거나 다 성공하거나..)
C: Consistency (일관성있는. 이를 해치는 트랜잭션은 종료됨. Referential integrity)
I: Isolation (고립성. 동시에 실행되는 트랙잭션들은 서로에게 영향을 미치지 못함.)
D: Durability (지속성. 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함.)
Big Data는 flexible concurrency Control을 가진다.
Concurrency control은 공존하는 두 개의 트랜잭션의 multiple reads and writes를 가능하게 한다.
오라클에는 locking (pessimistic c.c)와 timestamp-based (optimistic c.c) methods가 존재한다.
-트랜잭션이 시작될 때, timestamp로 작용하는 SDN(System Change Number)가 할당된다.
-쿼리의 SDN을 초과하지 않으면서 가장 높은 SDN을 가진 data SDN을 사용해야 한다…?
오라클의 locking
-row level locking, table lock
-데드락이 감지되면 rollback
financial data
*Big data에서 Recovery는 less important
Recovery는 redo와 undo로 이루어짐.
Redo log은 데이터베이스 버퍼에 transactional modification을 기록한다. Rollback segment는 데이터의 older version을 저장한다.
Recovery procedure
1) redo log를 적용하여 roll forward (redo log에 커밋되지 않은 데이터가 있으므로 uncommitted state)
2) rollback segment를 이용하여 커밋되지 않은 트랜잭션들을 roll back (committed state)
standby database에 의해 관리됨
일종의 백업용 db. 더 많은 공간이 필요…
이제 relational db에 object들도 임베디드 된다. Object는 자바, C 커도 등의 Methods일 수도 있고, user=defined aggregate func 일수도 있고..xml data일수도 있고… (*Big data의 3v중 variety)
Row Trigger: update row -> trigger -> update 다음 row…
*Statement trigger도 있음.
Before Trigger: DML(insert, update, delete) statement 실행 전에 트리거
After Trigger: DML 이후에 트리거
-data warehouse에서 잘 쓰임!
View는 데이터가 없는 가상의 테이블. 그래서 view를 조회하면 각각의 테이블로 가서 join한다.
MV는? 진짜 data를 stored! Join을 할 때 저장되어 있는 데이터를 불러오기만 하면 된다. (ex. Mv에 sum들을 저장해놓고 필요할 때 꺼내쓰기) mv는 summarizing data(sum,avg,min,max)등에 많이 쓴다. Mv는 data warehousing 그리고 분산 및 모바일 환경의 복제에서 속도를 높이기 위해 쓴다. Automatic query rewrite: optimization에서 언급한 그것…mv를 사용하는 더 효율적인 쿼리문으로 auto change!
Mv table B가 A table의 sum 값으로 이루어졌다고 치면.. A의 데이터가 바뀌면 A 기반으로 만들어진 mv table B도 refreshed된다.
Refresh 방법 두가지
-Full refresh :모든 것을 다시 계산
-Incremental refresh :원본테이블 A에서 바뀐 부분만 immediately 다시 계산(주로 small update인 경우.)
오라클은 dedicated server이고 multithreaded server임. Availability가 높아서 노드 하나가 실패해도 다른 노드는 available