DML 요청시 처리 방식
select ##,##,## from ####; 을 사용자 프로세스(sqlplus)에 입력하면 서버 프로세스에 요청한다.
서버 프로세스에서는 다음과 같은 순서로 작업을 수행한다.
1. '서버 프로세스'에서 문법검사
2. '데이터 딕셔너리 캐시'에서 테이블 존재여부 검사, 컬럼 존재여부 검사
데이터를 메모리에서 찾는것을 get, 메모리에 존재하면 hit 라고 한다.
3. '라이브러리 캐시'에서 문장을 실행한적 있는지 검사
실행계획은 '라이브러리 캐시'에 저장된다.
실행 계획을 실행 하는것을 parsing이라하며 작업 내용은 parsed code라고 부른다.
4. 실행계획이 있다면 parsing하고 없다면 최적화를 수행하고 parsing한다.
데이터는 '데이터베이스 버퍼 캐시'에서 불러온다.
데이터를 불러오는 방식은 full table scan, index scan 두가지가 있다.
5. '데이터베이스 버퍼 캐시'에서 '서버 프로세스'로 데이터 반환
'데이터베이스 버퍼 캐시'는 LRU알고리즘을 사용한다.
6. '서버 프로세스'는 '사용자 프로세스'에게 응답
(위의 과정중에서 찾는 데이터가 메모리에 존재하지 않으면 '데이터 파일'에서 '데이터베이스 버퍼 캐시'로 불러온다.)
insert, update, delete
1~4번 과정은 select와 똑같다.
4번에서 '데이터베이스 버퍼 캐시'에 해당 작업을 수행하는데
commit을 하더라도 '데이터베이스 버퍼 캐시'의 용량이 부족하기 전엔 '데이터 파일'에 저장하지 않는다.
commit을 안 하더라도 용량이 부족하면 '데이터 파일'에 저장한다.
대신 '리두 로그 버퍼'에 시간 순서대로 상세한 작업 내역을 적는다.
그리고 commit을 한다면 '로그 라이터'가 '리두 로그 파일'에 저장한다.
이렇게 하기 때문에 '데이터 파일'에 저장이 안 됐는데 전원이 꺼지더라도 작업 내역이 남아있기 때문에
데이터가 날아가지 않는다.
5. 작업 결과를 '서버 프로세스'가 '사용자 프로세스'에게 알려준다.