질의 처리 과정과 최적화 개요2

EunJi·2023년 3월 15일
0

고수준 언어로 표현된 질의
⬇️
어휘 분석, 구문 분석, 검증
⬇️
질의를 중간 형태로 표현
⬇️
질의 최적화
⬇️
실행 계획
⬇️
질의 코드 생성기
⬇️
질의를 실행하기 위한 코드
⬇️
런타임 데이터베이스 처리기
⬇️
질의 결과

고수준의 SQL문 들어옴
->
(컴파일러가 해당 SQL문을 분석하고 번역하는 파싱 과정이 필요.)
(따라서 해당 구문을 분석하고 컴파일을 해서 그 구문이 어떤 구문인지를 알아야함.)
->
Parsing/번역 과정을 거쳐 질의를 중간 형태로 바꿔놓음.
얘를 parsing한 결과물이고 트리 형태로 많이 표현이 되어서 파싱트리라고 함.
->
(무슨 구문이다. 어떤 조건에 따라 처리한다. 등의 내용이 분석이 됨.
따라서, 해당 질의를 실행할 수 있는 경우의 수를 따져봄.
해당 질의가 접근하고자 하는 테이블이 어떤 구조로 저장되어 있는지, 무슨 인덱스가 있는지에 따라서 어떤 실행 옵션을 선택을 할 수 있는지에 대한 경우의수가 나옴.
해다 경우의술르 찾고 비용을 따져봄. 그 중에서 최적의 실행 계획을 찾음.)
->
최적의 실행 계획이 선택됨.
->
(해당 계획에 따라서, 실제로 DBMS가 실행되는 실행 코드를 만듦.)
->
DBMS의 내부 함수들/절차들이 진행되는 코드를 만들면 해당 코드를 런타임 데이터베이스 처리기/DBMS의 엔진에 요청을 하면 하나씩 내부적으로 실행이 되고
->
질의 결과가 나옴.

이 질의처리 과정에서 최적화가 필요함.

질의 처리 최적화가 필요한 이유:
사람들이 사용한 SQL문은 고수준의 문장임. 즉, 디테일한 처리 방법을 담고 있지 않음.
실제로 저장되어 있는 구조로 처리할 때는 처리할 수 있는 경우의 수/ 실행 계획이 여러가지 가 있음. 해당 경우의 수들을 따져서 제일 적은 비용이 드는 것을 선택하는 것이 필요함.

<SQL 질의를 최적화 하기 위한 준비 단계>
사용자들이 DBMS에 SQL문을 사용하여 자신의 요구를 입력함.
DBMS는 SQL문을 받아서 SQL문 파싱 과정을 거침.
그러면 SQL문의 대상, relation, 조건 등을 찾아냄.
이를 파서트리라는 내부 구조로 바꿈.
파서트리는 입력 SQL문에 대해서 조금 더 요구사항의 요소들을 찾아놓은 내부구조임.
파서트리는 관계대수 연산의 조합 형태로 표현을 함.
관계대수 연산의 형태로 하는 이유: 관계데이터 모델의 연산 종류가 관계 해석에 의한 연산과 관계 대수에 의한 연산 두가지로 나눌 수 있음.
관계 해석은 SQL문과 같이 내가 무엇을 처리하길 원하는지, 즉, 처리 내용에 대해서 표현을 하여 사람들이 편리하게 사용할 수 있는데, 비절차적인 언어임.
내가 무엇을 원하는가 What을 설명하는데, 어떤 절차로 하는지 how에 대해서는 표현을 안 함.
어떤 순서로, 어떤 절차로 하는지를 문장에서 담고 있지 않기 때문에 표현하기가 편함.
관계대수는 대수 연산자를 사용. 연산자는 우선순위가 있어서 처리 순서가 있음. 즉, 절차적 언어임.
그래서 사람들이 편하게 비절차적으로 표현을 해도 그 안에 들어있는 요소들을 어떤 순서대로 할 것인가를 정해서 그 순서대로 처리해야함.
그래서 DBMS 내부 동작 원리를 관계 대수로 표현하면 관계대수가 절차적인 표현/언어의 형태이기 때문에 DBMS가 어떻게 처리하는가를 설명할 수 있음.
그래서 DBMS의 내부 연산 처리 순서/ 처리 방법을 실제로는 DBMS가 관계대수를 사용하는 것은 아니지만, 관계대수로 설명하면 조금 더 이론적/체계적으로 설명가능.
따라서, 비절차적인 사용자들의 관계해석을 바탕을 둔 SQL 언어를, 어떤 식으로 처리하는가 라는 것의 방법 순서를 담은 관계대수 형태로 표현하면 내부적인 처리 방법이 이론적으로/체계적으로 설명 가능.
따라서, SQL문을 받아서 관계 대수형태로 어떻게 바꿀 것인가 하는 처리 순서로 바꾸면 기본적으로 SQL문을 어떻게 처리해야하는지가 표현이 됨.
따라서, SQL문에 대한 파싱한 내용을 관계대수 형태로 표현을 한 것을 파서트리라고 생각하면 됨.
파서트리에는 어떤 연산을, 어떤 순서로 하는지가 정해져 있음.
그 연산의 방법과 순서가 정해져있으니, 그대로 처리하면 되지만, 그게 효율적인지를 모름.
그래서 파서트리를 좀 더 효율적으로 처리되는 새로운 연산 순서로 바꾸는 것이 좋음.
이게 바로 최적화임.
그러면 조금 더 최적화된 파서 트리가 나오는 것임.
그러면 이것으로 파일이나 인덱스를 사용해서 어떻게 실행할 것인가인 실제 실행 계획/실행 코드를 만들면, 그러면 그냥 실행하면 됨.

이게 질의의 처리 과정 /최적화 과정임.

SQL문 -> 관계 대수 형식의 파서 트리 형태로 변환 == 최적화를 위한 준비가 된 것.

정리:
SQL 질의를 최적화 하기 위한 준비 단계:
입력문장: SQL 질의
⬇️
질의 블록들로 분해
각각의 요소(결과attribute, 연산 대상 relation, where절 조건)를 뽑아냄.
⬇️
관계대수로 번역
즉, 내부 파서-트리의 내부 구조로 변경.
파서트리는 관계대수식을 트리 모양으로 표현한 것임.
즉, SQL문을 관계대수식으로 바꾸는 것.
(관계대수식은 순서가 있음!)
그리고 관계 대수식으로 바꾼 걸 또 내부 트리구조로 바꿈.

결과적으로 최적화/질의 처리는 입력으로 들어온 SQL문을 관계 대수의 조합으로 바꾼 후,
관계 대수 연산의 실행 방법을 찾는 것이 질의 처리/최적화 과정이라고 볼 수 있음.!

profile
말하는 감자

0개의 댓글