Site icon DBA의 정석

Select 문장의 실행 원리


# Select 문장의 실행 원리 



Parse(구문분석) –> Bind(치환) –> Excute(실행) –> Fetch(인출)



(1) Parse (구문 분석 단계)

 문법검사 : select, from, where 등의 Keyword를 검사합니다 

 의미검사 : 위 문법들을 제외한 칼럼명, 테이블명 등의 사용자의 쿼리내용에 따라 달라지는 값들을 검사합니다(ex:명시한 칼럼이나 테이블이 있는지 검사)

 권한검사 : 위 2가지 과정을 거친 후 해당 쿼리를 진행할 수 있는 권한이 있는지 검사합니다

 실행계획 : 이후 실행계획이 Shared Pool-Library Cache에 있는지 검사합니다. 있다면 Soft Parse이고, 없다면 실행계획을 생성해야 되기 때문에 Hard Parse를 하게 됩니다.(실행계획은 옵티마이저가 함)

 Soft Parse인지 검사할때 쓰이는 것이 Hash함수인데, SQL문장 등을 ASCII값으로 변경후 Hash 함수를 통해 hash값으로 변경해서 Library Cache에 있는 hash값들과 비교하게 됩니다.

 값들이 실제로 들어가 있는 공간을 커서라고 부릅니다. 현재 Library Cache안에 있는 커서는 공유커서를 의미합니다

 Hash List : LRU 리스트처럼 Hash도 관리할 수 있는 리스트가 필요합니다. 여기에서도 사용자들의 사용 우선권을 부여하기 위해 Latch를 사용합니다



**Soft parse가 성능이 좋다고 하지만 만약 10명의 사용자각 찾는 모든 데이터가 Library Cache에 있다  하더라도 지금과 같이 Latch가 1개 밖에 없어서 동시에 작업 할 수 있는 사용자가 1명 밖에 없다면 속도가 느려지게

 됩니다. 즉 Soft Parse라고 무조건 빠르다는 생각은 아닐 수 있다는 것입니다.



-옵티마이저는 RBO(Rule Based Optimizer) CBO(Cost Base Optimizer)로 나뉩니다. 차이는 실행계획을 세우는 방식의 차이입니다

 



(2)Bind(치환)

-1번만 파싱해서 실행계획을 1개만 생성 한 후 학번과 이름만 바꾸어서 1000번 실행하는 것이 훨?씰 더 부담도 적고 쿼리 수행속도도 빠를 것입니다.

– Parsing 작업 (구문분석) 이 끝나면 Bind 단계로 넘어가는데 이 단계를 예를 들어보면,

– emp 테이블에서 사원 번호를 입력받아 100 명의 사원 정보를 출력 한다고 하면, 사원번호 값만 다르고 SQL 문장은 동일할 것이다. 이럴 경우, 100 개의 SQL 을 Parsing 해서 100 개의 실행 계획을 만드는 것 보다       1번만 parsing 해서 1 개의 실행 계획을 만들어서 사원번호만 바꿔서 100번 실행하는 것이 수행 속도가 훨씬 빠르다.

– 이런 작업을 Bind 라 하며, 여기서 사용되어지는 사원번호를 Bind 변수라고 한다.



(3)Excute(실행)

-하드 디스크의 데이터 파일에서 데이터가 들어있는 블록을 찾아 메모리(Database Buffer Cache)로 복사해 오는 과정

-DB Cache에 해당 블록이 없을 경우에는 서버프로세스가 찾는 블록의 주소를 hash함수에 넣어 

hash value를 만든 다음 이름 DB cache hash list를 비교해서 동일한 value가 있는지 검사를 합니다. 있다면 다음 단계인 fetch로 진행하고 없다면 서버프로세스가 하드 디스크로 가서 해당 블록을 찾아 DB Cache로 복사해 오게 됩니다.



*Block 단위의 I/O

-Block : 데이터 파일이 메모리와 하드디스크를 오고 갈 때 이동하는 단위.

 DB_BLOCK_SIZE 파라미터의 크기로 결정되며, DB가 생성될 때 적용되어 그 이후에는 DB를 새로 생성하지 않는한 변경할 수 없습니다

 9i : 4k

 10g : 8k

 사이즈가 크면 I/O를 줄일 수 있는 반면 공간 낭비가 많이 생길 수가 있고 DB Buffer Cache에서 Wait가 많이 생겨 성능이 저하될 수 있습니다.



(4)Fetch(인출)

-복사한 블록에서 필요한 내용 추출

Exit mobile version