[Database] SQL 문장의 실행 원리
[Database] SQL 문장의 실행 원리
SQL문장의 실행 과정 정리
- User Process가 서버 위치 정보가 들어있는 tnsnames.ora를 참고해 해당 서버로 찾아감
TNS(Transparent Network substrate) : 오라클에서 사용하는 기술로, Client/Server 또는 Server/Server간에도 Data의 전송을 가능하게 해주는 기술
tnsnames.ora : 오라클 client측에서 오라클 서버로 접속할 때 필요한 프로토콜 및 포트번호, 서버주소, 인스턴스등을 설정해주는 파일로서 client쪽에 위치 - 서버 쪽 listener.ora 파일 안에 접속하려는 서버 IP가 있으면 리스너는 해당 Server Process를 불러옴
listener.ora : 오라클 서버에서 클라이언트의 요청을 듣고, 클라이언트와의 통신 환경을 설정하는 파일 - User Process는 Server Process에게 수행해야할 쿼리 전달
- Server Process는 Parse -> Execute -> Fetch과정을 통해 쿼리 수행
- SQL문장을 받은 서버프로세스는 Syntax check, Semantic Check를 한후 권한 검사
- 실행 계획이 있는 경우 : Execution 단계로 진행
- 실행 계획이 없는 경우(=공유 X, Soft Parse실패) : 옵티마이저를 찾아가 실행계획을 찾아달라 함(Hard Parse)
- 작업이 끝나면 Server Process는 결과값은 User Processd에게 전달하고, User Process는 사용자에게 전달
주의할점
- 오라클과 리스너는 서로 다른 프로그램이기 때문에 server는 켜져 있는데 listener가 죽어있는 경우도 있음 --> 신규 접속 불가능
- 리스너는 새로 들어오는 client만 관리
- 이미 들어와 있는 사용자는 리스너를 통하지 않고 바로 server process와 연결함
- 리스너에 장애가 나면 전에 접속한 사람은 이용가능하지만, 신규 접속은 불가
< SQL 문장이 수행되는 과정 > |
- User Process : SQL을 작성하는 프로그램
- 권한검사 : 어떤 사용자가 해당 오브젝트에 접근 할 수 있는 권한 여부를 확인하는 과정
- Library Cache : 한번이라도 실행된 SQL 또는 PL/SQL 문장과 해당 문장의 실행계획이 공유되 있는 공간
- 옵티마이저 : 네비게이션 같은 프로그램, Data Dictionary 등을 참조하여 실행계획을 생성
SELECT문 실행 원리
Parse --> Execute --> Fetch
Parse (구문 분석)
- Syntax Check 문법 검사 : 오라클 키워드 검사
- Semantic Check 의미 검사 : 테이블이름이나 칼럼이름 검사
- Shared Pool Check 권한 검사 : 해당 사용자가 이 테이블을 조회할 수 있는지 검사
- 검사들은 Data Dictionary를 사용하게 되고, Data Dictionary를 캐싱해 두고 성능을 높여주는 곳이 Shared Pool안의 Dictionary Cache 또는 Row Cache
- Shared Pool의 Library Cache를 검사한 후 공유되어 있는 실행계획이 있는지 검사
- 있으면 바로 Execution 단계로 진행 -> Soft Parse 또는 커서 공유라고 함
- 없으면 Optimizer를 찾아가서 실행 계획을 만들어 달라고 함 -> Hard Parse
Soft Parse
- Library Cache안에 있는 커서 즉, 공유커서는 이미 한번 수행되었던 SQL문장의 실행계획과 관련 정보를 보관하고 있다가 재활용 함
- Optimizer 가 실행계획을 만들어주는 부담을 줄이게 됨으로써 SQL의 수행 속도를 빠르게 함
Hard Parse
- Optimizer는 실행 계획을 생성시켜주는 역할
- 실행 계획을 세울 때 데이터 딕셔너리정보를 보고 판단
- Optimizer가 실행 계획을 세워주는 대로 실행을 하기 때문에 SQL 수행 속도에 절대적인 영향
Execution(실행)
하드 디스크의 데이터 파일에서 데이터가 들어있는 블록을 찾아 메모리 즉, DB Buffer Cache로 복사해 오는 과정
- 서버 프로세스가 해당 데이터를 가져오기 위해 해당 데이터가 저장되어 있는 블록을 찾게 됨
- 찾는 모든 데이터는 Database Buffer Cache에 있어야 함
- 서버 프로세스는 해당 블록을 찾기 위해서 우선 DB Buffer Cache를 확인하는데, DB Buffer Cache에 원하는 블록이 있으면 즉시 다음 단계인 Fetch단계를 진행
- 없으면, 서버 프로세스가 하드 디스크로 가서 해당 블록을 찾아 DB Buffer Cache로 복사
- 디스크에서 메모리로 복사해 오는 시간이 굉장히 오래 걸리는 편- > 성능에 영향
Fetch(인출)
- DB Buffer Cache에 복사된 블록 중에서 사용자가 원하는 데이터만 골라내는 과정
출처
댓글
댓글 쓰기