오라클 액세스
1)SELECT 명령어 처리
(PARSING LEVEL)
1.서버 프로세스 구문분석 요청
사용자가 SQL 명령어들을 입력하면 SQL명령어는 text string으로 서버로 전송하게 된다.
2.소프트 파싱과 하드 파싱
SGA의 라이크러리 캐쉬에서 동일문장을 실행했던 실행계획을 검색 동일 실행계획을 존재하면 DB버퍼캐쉬에서 해당결과를 찾아 바로 유저에서 Fetch 작업을 함, 동일문장이 존재하지 많으면 딕셔너리 캐쉬에서 오브젝트를 참조하여 하드파싱한다.
하드 파싱 : 하드파싱은 공유 풀에 해당 SQL에 대한 구문 분석이 존재 하지 않을 경우 이다. 이와 같은 경우에는 구문분석을 처음부터 수행하게 된다. 소프트 파싱 : 반대로 공유풀에 해당 SQL에 대한 구문분석이 존재할 경우이다. |
3. 문장검사
parsing과정이 많기 때문에 오라클의 처리 속도를 올리기 위해서는 동일한 SQL문을 사용하여 library cache에서 바로 실행을 할 수 있게 해주는 것이 기본이 된다.
1. 대/소문자 동일 2. 스키마 동일 3. 빈 스페이스 일치 4. 주석도 일치 5. bind변수 type도 동일해야 동일한 문장이다. |
4. 데이터베이스 분석
딕셔너리 캐쉬에서 티이블 및 갈럼 존재 유무를 확인한다.
5. 쿼리 단순화
옵티마이져가 좀 더 좋은 실행계획을 생성하기 위해 내부적으로 SQL을 변경한다.
6. 권한확인
시스템 테이블 스페이스에 저장된 DBA_SYS_PRIVS, DBA_TAB_PRIVS 뷰를 이용해 권한 확인한 후 딕셔너리 캐쉬에 저장한다.
7. 락 수행
USER가 DML를 던지면 변경되는 ROW에 대한 ROW LOCK과 TABLE에 대한 TABLE LOCK이 발생.
ROW LOCK (TX)
SQL 문장에서 WHERE 조건에 해당되는 ROW에 대하여 다른 유저들이 변경할 수 없도록 EXCLUSIVE LOCK 이 생긴다. TX LOCK이 걸린 ROW는 DML 문장을 실행한 유저가 COMMIT이나 ROLLBACK을 할때 까지 걸리므로 다른 유저들이 변경할 수 없다.
TABLE LOCK (TM)
TX LOCK이 걸린 ROW가 저장된 TABLE에 대한 LOCK 이다.
DML SQL 문장을 수행하는 중에, 해당 테이블이 ALTER 나 DROP 되는 것을 방지하기 위해서 TM LOCK을 사용한다.
같은 테이블에서 실행할 수 있는 SQL 문장과 실행할 수 없는 SQL 문장을 구분하기 위해서다.
TM LOCK에는 RS(ROW SHARE), RX(ROW EXCLUSIVE), S(SHARE), SRX(SHARE ROW EXCLUSIVE), X(EXCLUSIVE) 가 있다.
8. Excute Plan 및 Tree 생성
9. 결과물이 SGA에 저장
(EXCUTE LEVEL)
실행계획을 가지고 DB버퍼 캐쉬에서 해당 ROW를 검색 후 존재하면 결과값을 우저에서 전홍 한다.
존재하지 않으면 데이터 파일에서 해당값을 검색하여 DB버퍼 캐쉬로 읽어 올린다.
(FETCH LEVEL)
유저에서 해당 결과값을 화면으로 출력해준다.
2) DML 구문 처리
(PARSING LEVEL)
1. 서버프로세스 구문분석요청
2. SGA의 라이브러리 캐쉬에서 동일문장 검색 .........-> 소프트 파싱 or 하드 파싱
3. 문장검사
4. 데이터 베이스 분석 ... 딕셔너리 캐쉬에서 데이블 및 칼럼 존재 유무 확인
5. 옵티 마이저가 좀더 좋은 실행계획을 생성하기위한 쿼리 단순화
6. 권한확인
7. 락수행
8. Excute Plan 및 Patse Tree 생성
9. 결과물이 SGA에 저장
(EXCUTE LEVEL)
1. 실행 계획을 가지고 데이터파일의 해당 값을 검색하여 DB 버퍼 캐쉬로 읽어 올린다.
2. 서버프로세스는 언두 세그 먼트를 확보한다.
3. 변경된 내용을 리두 로그버퍼에 저장한다.
4. 변경 이전 이미지를 언두 세그먼트에 저장한다.
5. DB버퍼 캐쉬에 변경된 내용을 적용한다.
6. 유저에게 1row update라는 결과를 전송한다.
7. commit 명령어를 수행하면 리두 로그버퍼에 있는 변경된 내용을 리두 로그 파일에 기록한다.
단 시점은 사용자에 의한 commit 명령이 발생 했을 경우
리두로그 버퍼가 1/3이상 사용되었을 경우
1MB 이상의 리두가 생성되었을 경우
3초마다 리두 로그 파일에 내려 쓰여 진다.
출처 - http://mes2good.egloos.com/761982