말 그대로 DBMS에서 많은 수의 부하를 처리하는데, 시간이 오래 걸리는 현상을 의미한다.
이러한 병목현상이 발생하는 요인은 여러가지가 존재한다.
이때 대부분의 DBMS 성능은 I/O에서 결정된다고 하여도 과언이 아니다. 따라서 DBMS I/O 병목으로 인한 성능 문제를 해결하기 위해선, 절대적인 block I/O를 줄여야 한다.
블록 단위로 읽을 경우, 하나의 레코드만을 읽으려 할 때도 해당 블록(table) 전체를 읽는다. 그만큼의 성능 및 속도 저하 등이 발생할 수 있으므로, block I/O를 줄이기 위해 모델설계, DBMS 환경구축, SQL 튜닝 등을 진행한다.
block I/O가 실행되는 과정에서는 하나의 process가 CPU를 사용하는 과정을 거치고, 해당 과정은 아래 모식도와 같이 나타낼 수 있다.
다른 프로세스(SQL문) 측에서 디스크 데이터를 읽어야 할 경우, 현재의 프로세스(또다른 SQL문)는 CPU를 OS에 반환하고 수면(waiting) 상태에서 I/O가 완료되기를 기다린다(정해진 OS함수를 호출하고 CPU를 반환한채 알림설정 및 대기큐에서 대기).
따라서 SQL에서 발생하는 절대적인 I/O 횟수를 줄이는 것이 성능 개선의 핵심이라 할 수 있다.
SQL문을 실행하기 위해 옵티마이저라는 최적 실행 엔진이 존재하며, Block I/O 및 인덱스 등 성능을 결정하는 요인에 따라 옵티마이저의 속도 등이 영향을 받게 될 것이다.
SQL은 구조적, 집합적, 선언적인 구조화된 언어이며, 각 프로시저(SQL명령을 모아둔 코드)를 만드는 역할은 옵티마이저가 담당한다(SQL을 수행할 최적의 처리 경로를 생성해주는 DBMS의 핵심엔진).
SQL 문을 실행하는 단계는 크게 4가지, SQL Parsing > 실행계획작성(*통계정보 활용) > 실행계획선택 > SQL 실행단계로 나눌 수 있다.
이를 아래와 같이 세분화하여 살펴볼 수 있다.
사용자로부터 SQL문을 전달받고 SQL Parser가 Parsing을 진행한다.
Parsing Tree를 생성(SQL문을 이루는 개별 요소를 분석)하고, Syntax(문법) 오류 및 Semantic(의미상 오류, 존재하지 않는 테이블 등) 오류 등을 확인한다.
Optimizer가 하는 단계로, 미리 수집한 시스템이나 통계정보를 바탕으로 다양한 실행경로를 생성 후 가장 효율적인 실행경로를 선택한다.
DBMS 성능에 가장 핵심적인 요소이다.
옵티마이저가 선택한 실행 경로를 실제 실행 가능한 코드(script 등), 프로시저 형태로 포맷팅한다.
사용자가 원하는 작업을 가장 효율적으로 수행하기 위해, 최적이 데이터 액세스 경로를 선택해주는 DBMS 핵심엔진이다.
통계정보를 이용하여 각 실행계획의 예상 비용을 산정한 후, 최저 비용을 나타내는 실행계획을 선택한다.
block I/O - http://wiki.gurubee.net/pages/viewpage.action?pageId=26739100
프로세스 상태 - https://jhnyang.tistory.com/7
옵티마이저 - https://coding-factory.tistory.com/743프로시저 - https://wyatt37.tistory.com/75