GaussDB SQL 쿼리문 실행 과정 분석

이 기사는 Huawei Cloud 커뮤니티 " [GaussTech Issue 2] GaussDB SQL 쿼리문 실행 프로세스 분석 ", 작성자: GaussDB 데이터베이스에서 공유되었습니다.

상단제목.jpg

관계형 데이터베이스에 대한 SQL의 중요성은 자명합니다. 그는 오케스트라의 지휘자처럼 작품의 올바른 해석과 리듬의 조화와 통일성을 지도한다. 차세대 관계형 분산 데이터베이스인 Huawei Cloud GaussDB는 탁월한 기술 성능과 산업 경쟁력을 갖추고 있습니다. 많은 사람들이 GaussDB의 핵심 기술에 대해 궁금해하고 포럼에 메시지를 남겼습니다.

GaussDB SQL 문은 어떻게 실행되나요?
GaussDB SQL 엔진의 원리는 무엇입니까?
 
GaussDB SQL 엔진의 핵심 기술 포인트는 무엇입니까?
…….

오늘은 GaussDB SQL 엔진부터 시작해 GaussDB SQL 엔진의 원리와 핵심 기술 포인트 등 GaussDB SQL 쿼리문의 실행 과정에 대해 배워보겠습니다.

이해 과정에서 궁금하신 점이나 주요 기술 사항이 있으신 경우 [윤카 Q&A]에 참여하시면 GaussDB SQL 엔진의 미스터리를 풀 수 있고, 상호작용 및 선물도 받으실 수 있으며 , 메시지를 남겨주시면 전문가들이 일대일로 만나보실 수 있습니다. -one 질문에 답하면 질문에 대한 보상을 받을 수 있는 기회가 주어집니다.

↓↓↓↓ 다음은 원문입니다

먼저 GaussDB의 시스템 구조를 간략하게 소개하고, GaussDB SQL 쿼리문의 실행 과정을 분석해 보겠습니다.

 

GaussDB 시스템 아키텍처

GaussDB에는 다음 그림과 같이 Huawei Cloud에 중앙 집중식(그림 1)과 분산형(그림 2)의 두 가지 배포 형태가 있습니다.

1.png

그림(1) 중앙집중화

2.png

그림(2) 분포

 

GaussDB SQL 문을 실행하는 동안 다음과 같은 주요 역할이 관련됩니다.

GTM

글로벌 트랜잭션 관리자는 글로벌 트랜잭션 ID, 트랜잭션 스냅샷, 타임스탬프 및 시퀀스 정보와 같은 전역적으로 고유한 정보를 생성하고 유지 관리하는 일을 담당합니다.

중국

코디네이터 노드. 애플리케이션으로부터 액세스 요청을 수신하고 실행 결과를 클라이언트에 반환하는 작업을 담당하며 작업 분할이 각 DN에서 병렬로 실행되도록 예약합니다. 각 CN은 각 DN에 연결되며, 각 CN은 동일한 메타데이터 콘텐츠가 포함된 메타데이터 복사본을 보유합니다.

DN

데이터 노드. 비즈니스 데이터 저장(행 스토리지, 컬럼 스토리지, 하이브리드 스토리지 지원), 데이터 쿼리 작업 실행, 실행 결과를 CN으로 반환하는 역할을 담당합니다.

그중 DN은 주로 GaussDB SQL 문 실행을 담당합니다. 그 논리적 아키텍처는 다음 그림에 나와 있습니다.

3.png

그림(3) GaussDB 논리 아키텍처

GaussDB에는 SQL 엔진 스토리지 엔진  이라는 두 가지 주요 엔진이 포함되어 있습니다 . SQL 엔진은 쿼리 프로세서라고도 하며 주요 기능은 SQL 구문 분석, 쿼리 최적화 및 쿼리 실행입니다. SQL 구문 분석은 입력된 SQL 문에 대해 어휘 분석, 구문 분석, 의미 분석을 수행하여 쿼리 트리를 생성합니다. 쿼리 트리가 규칙 최적화(RBO)와 비용 최적화(CBO)를 거친 후 실행 계획이 생성됩니다. 실행자는 사용자가 원하는 쿼리 결과를 얻기 위해 실행 계획에 따라 해당 데이터의 추출, 연산, 업데이트, 삭제 등의 작업을 수행합니다.

스토리지 엔진은 데이터 읽기 및 쓰기 처리(행, 인덱스, 페이지, 할당 및 행 버전에 대한 I/O 요청 처리), 데이터 버퍼 관리(버퍼 풀) 및 트랜잭션을 포함하여 모든 데이터 I/O를 관리합니다. 관리자. 그 중 트랜잭션 관리에는 ACID 속성을 유지하는 잠금 메커니즘(Lock)과 트랜잭션 로그 관리(XLOG)가 포함됩니다.

SQL 엔진과 스토리지 엔진 사이에는 AM(액세스 방법) 계층이 있습니다. AM은 여러 스토리지 엔진(Astore, Ustore 등)을 지원하기 위해 스토리지 계층을 캡슐화합니다. SQL 계층은 스토리지 계층을 직접 호출하지 않고 AM 계층을 통해 서로 다른 스토리지 엔진에 따라 서로 다른 실행 본문을 호출합니다.

GaussDB 논리 아키텍처 다이어그램에서 GaussDB 아키텍처 설계가 통합 트랜잭션 메커니즘, 통합 로그 시스템, 통합 동시성 제어 시스템, 통합 메타 정보 시스템을 포함하는 현대 소프트웨어 시스템 추상화 및 계층적 분리의 설계 원칙을 따른다는 것을 알 수 있습니다. 통합 캐시 관리 시스템. 따라서 GaussDB 기술 아키텍처에는 다음과 같은 주요 기능이 있습니다.

  • SQL 최적화, 실행 및 스토리지 계층 분리를 지원합니다.
  • 플러그형 스토리지 엔진을 지원합니다.
 

SQL 쿼리문 실행 과정

SQL 쿼리(SELECT) 문의 실행 과정은 다음과 같습니다.

4.png

그림 (4) 쿼리문 실행 과정

위 그림에서 볼 수 있듯이 SQL 문은 SQL 구문 분석, 쿼리 최적화를 통해 쿼리 트리를 생성하여 실행 계획을 생성한 다음 실행 계획을 쿼리 실행기로 전달하여 물리 연산자 실행 작업을 수행해야 합니다.

SQL은 관계 대수학의 "절차적" 부분을 버리고 관계 대수학의 일부 논리 연산자에 대한 설명을 흡수하는 기술 언어입니다. SQL 구문 분석의 주요 기능은 일반적으로 어휘 구문 분석, 구문 구문 분석 및 의미 구문 분석 하위 모듈을 포함하는 관계 연산자로 구성된 쿼리 트리로 SQL 문을 컴파일하는 것입니다.

규칙 최적화(RBO)는 쿼리 트리를 기반으로 등가 관계형 대수 변환을 수행하여 SQL 문을 보다 효율적인 등가 SQL로 변환하며 데이터베이스 최적화 프로그램에서 핵심 역할을 합니다. 특히 복잡한 쿼리에서는 성능이 크게 향상될 수 있습니다.

쿼리 실행은 실행 계획에 따라 SQL 쿼리문을 실행하는 것입니다. 기본 저장 방법 선택의 합리성은 쿼리 실행 효율성에 영향을 미칩니다.

파서

GaussDB SQL 구문 분석에는 일반적으로 어휘 구문 분석, 구문 구문 분석 및 의미 구문 분석이 포함됩니다.

1. 어휘 분석 : 질의문에서 시스템이 지원하는 키워드, 식별자, 연산자, 단말 등을 식별하고, 각 단어의 고유 품사를 파악합니다.

SQL 표준은 어휘 분석 과정에서 SQL 문을 키워드 정보와 간격 정보를 기반으로 독립적인 원자 단위로 나누고 각 단위를 단어로 표시합니다.

2. 문법 분석 : 정의된 SQL 문법 규칙에 따라 어휘 분석에서 생성된 단어를 사용하여 문법 규칙을 일치시키고 해당 AST(Abstract Syntax Tree)를 생성합니다. 

3. 의미론적 분석 : 구문 트리의 유효성을 확인하고 구문 트리의 해당 테이블, 열, 함수 및 표현식에 해당 메타데이터가 있는지 확인하고 추상 구문 트리를 쿼리 트리로 변환합니다. 

의미론적 분석 과정은 유효성 의미론적 바인딩 과정이기도 하며, 의미론적 분석 검사를 통해 추상 구문 트리가 쿼리 트리로 변환됩니다. 쿼리 트리는 관계 대수 표현식의 형태로 표현될 수 있습니다.

 

옵티마이저

최적화 프로그램은 쿼리 효율성을 향상시키는 매우 중요한 수단입니다. 여기에는 규칙 최적화와 쿼리 최적화라는 두 부분이 포함됩니다.

규칙 최적화(RBO)

규칙 최적화는 쿼리 트리를 기반으로 한 등가 관계 대수 변환입니다. 관계 대수를 기반으로 한 최적화 형태이므로 대수 최적화라고도 합니다. 두 관계형 대수 표현식으로 얻은 결과는 정확히 동일하지만 실행 비용은 매우 다를 수 있으며 이는 규칙 최적화의 기초를 형성합니다.

규칙 최적화는 두 가지 기본 원칙을 따릅니다.

(1) 동등성: 원래 명령문과 다시 작성된 명령문의 출력 결과가 동일합니다.

(2) 효율성: 다시 작성된 문은 원래 문보다 실행하는 데 시간이 덜 걸리고 리소스를 더 효율적으로 사용합니다.

GaussDB는 다음과 같은 몇 가지 주요 규칙 최적화 기술을 구현합니다.

조건자 푸시다운 : 조건부 필터링을 더 일찍 트리거하고 처리되는 행 수를 줄입니다.

중복 작업 제거 : 중복된 테이블과 열을 제거하여 계산량을 줄입니다.

하위 쿼리 승격 : 승격 후 더 많은 조인 주문이 일치될 수 있습니다.

외부에서 내부로의 변환 : 내부 조인은 더 많은 조인 순서와 일치할 수 있습니다.

서브링크 프로모션 : 서브플랜 및 방송 운영 감소

불평등 조인 제거 : NestLoop 및 브로드캐스트 작업 감소

GaussDB는 다수의 고객에게 서비스를 제공하는 과정에서 비즈니스 SQL 사용 패턴을 추상화하고 일부 고급 재작성 규칙을 구현합니다. 앞으로의 칼럼에서는 GaussDB의 규칙 최적화 기술에 대해 자세히 소개하겠습니다.

쿼리 최적화

쿼리 최적화는 "규칙 최적화"의 출력을 기반으로 데이터베이스의 내부 통계 정보와 결합하여 SQL 문의 구체적인 실행 방법, 즉 실행 계획을 계획하는 것입니다. 다양한 최적화 방법을 기반으로 쿼리 최적화 기술은 다음과 같이 나눌 수 있습니다.

(1) CBO(Cost Based Optimization, 비용 기반 쿼리 최적화): SQL 문에 해당하는 후보 실행 경로의 비용을 추정하고, 후보 경로 중에서 비용이 가장 낮은 실행 경로를 최종 실행 계획으로 선택합니다.

(2) ABO(AI Based Optimization, 머신러닝 기반 쿼리 최적화): ABO는 과거 경험에 대한 지속적인 학습을 통해 대상 시나리오의 패턴을 추상화하고 동적 모델을 형성하며 적응적으로 사용자의 실제 시나리오를 최적화합니다. 최적의 실행 계획.

GaussDB는 CBO 기반 최적화 기술을 사용하고 이를 ABO와 결합하여 모델링 효율성, 추정 정확도 및 적응성을 적극적으로 탐색합니다.

5.png

그림 (5) 쿼리 최적화 단계

통계 정보 모델 : 통계 정보는 계획 경로 비용을 계산하는 초석입니다. 통계 정보의 정확성은 비용 추정 모델의 행 수 추정 및 비용 추정에 중요한 역할을 하며 이는 쿼리 계획의 품질에 직접적인 영향을 미칩니다. GaussDB 기본 테이블 데이터의 특징으로는 고유값, MCV(Most Common Values) 값, 히스토그램 등이 있습니다.

행 추정 : 제약 조건에 따라 선택 비율이 결정된 후 계획된 경로별로 처리해야 할 행 수를 결정하고 준비할 행 수를 기준으로 처리해야 하는 페이지 수를 계산할 수 있습니다. 비용 추정.

비용 추정 : 데이터 양을 기준으로 다양한 연산자의 실행 비용을 추정합니다. 각 연산자의 비용의 합은 계획의 총 비용입니다.

계획된 경로가 페이지를 처리할 때 I/O 비용이 있고, 계획된 경로가 튜플을 처리할 때(예: 튜플에 대한 표현식 평가) CPU 비용이 있습니다. GaussDB는 분산형 데이터베이스이므로 CN과 DN 간 데이터 전송에는 통신 비용이 발생합니다. 따라서 계획의 총 비용은 다음과 같이 표현될 수 있습니다.

총 비용 = IO 비용 + CPU 비용 + 통신 비용

  • 경로 탐색 : 경로 최적 알고리즘(동적 프로그래밍, 유전 알고리즘)을 풀어 연결 경로 탐색 과정을 진행하고, 최소 탐색 공간으로 최적의 연결 경로를 찾는다.

GaussDB는 상향식 검색 모드와 무작위 검색 모드를 조합하여 사용합니다. 검색 과정은 쿼리 트리에서 실행 계획으로 변환하는 과정이기도 합니다. 예를 들어 각 테이블은 서로 다른 스캔 연산자를 가질 수 있고, 논리적 조인 연산자도 다양한 물리적 조인 연산자로 변환될 수 있습니다.

  • 계획 생성: 쿼리 실행 경로를 실행 계획(PlanTree)으로 변환하고 실행을 위해 실행자에게 제공합니다.

쿼리 최적화는 특히 복잡한 쿼리를 처리할 때 시간이 오래 걸릴 수 있습니다. Plan 캐싱은 GaussDB의 중요한 기능으로 쿼리문의 실행 계획을 캐싱하여 다음에 동일한 쿼리를 실행할 때 캐시에 있는 실행 계획을 바로 사용할 수 있도록 함으로써 반복 계산을 방지하고 쿼리 성능을 최적화할 수 있습니다.

[ 핵심 기술 포인트 ] CBO + ABO: AI 알고리즘을 도입해 CBO 모델을 개선해 쿼리 옵티마이저가 데이터를 기반으로 평가 결과를 동적으로 조정하는 기능을 제공한다.
 
[ 핵심 기술 포인트 ] 계획 캐시: GaussDB의 계획 캐시에는 계획을 적응적으로 선택하고 자동으로 업데이트하는 기능이 있습니다. 쿼리 성능의 안정성과 최적화를 보장하기 위해 다양한 매개변수 구성에 가장 적합한 캐시 계획을 자동으로 선택할 수 있습니다.

분산 쿼리 최적화

네이티브 분산 데이터베이스로서 분산 쿼리 최적화 기술은 특히 중요합니다.

GaussDB 분산 아키텍처는 각 노드의 컴퓨팅 리소스를 최대한 활용하며 노드 규모가 확장됨에 따라 전반적인 성능이 선형적으로 증가합니다. 분산 아키텍처에서 성능과 리소스 활용을 극대화하기 위해 GaussDB는 다음 그림과 같이 CN 경량 계획, FQS(Fast Query Shipping) 계획, 스트림 계획 및 원격 쿼리 계획의 네 가지 분산 계획을 지원합니다.

6.png

그림(6) 4가지 분산 계획

  • CN 경량: 실행을 위해 명령문이 단일 DN으로 직접 전송됩니다(LIGHT_PROXY).

    • 실행원리: CN은 소켓을 통해 해당 DN에게 직접 QPBE 메시지를 전달한다.

  • 적용 가능한 시나리오: 문은 DN(단일 샤드 문)에서 직접 실행할 수 있습니다.

  • FQS(Fast Query Shipping) 문 발급 : SQL 문 발급 계획

    (REMOTE_FQS_QUERY)

    • 실행 원리: CN은 옵티마이저를 거치지 않고 직접 RemoteQuery 계획을 생성하고 실행기 로직을 ​​통해 DN으로 보냅니다. 각 DN은 푸시다운 문을 기반으로 실행 계획을 생성하여 실행하고, 실행 결과는 CN에 요약됩니다.

    • 적용 가능한 시나리오: 실행을 위해 명령문을 여러 DN으로 완전히 푸시다운할 수 있으며 DN 간에 데이터 상호 작용이 필요하지 않습니다.

  • STREAM 계획 전달: 분산 SQL 계획 배포 계획(STREAM)

    • 실행 원리: CN은 옵티마이저를 통해 원본 명령문을 기반으로 스트림 연산자와 실행 계획을 생성하고 이를 DN으로 전송하여 실행합니다. DN 실행 과정에서 데이터 상호 작용(스트림 노드)이 있습니다. 스트림 운영자는 데이터 교환을 위해 DN 간의 연결을 설정하고 CN은 실행 결과를 요약합니다. DN이 대부분의 계산을 수행합니다.

    • 적용 가능한 시나리오: CN과 DN 간, 실행 중 DN과 DN 간 데이터 상호 작용이 포함된 복잡한 문 .

  • 원격 쿼리 계획: 일부 SQL 문(REMOTE_QUERY) 발행을 위한 분산 계획

    • 실행 원칙: CN은 옵티마이저를 통해 원본 문의 일부에서 RemoteQuery 계획을 생성하고 각 RemoteQuery를 DN으로 보냅니다. DN이 실행된 후 중간 결과 데이터를 CN으로 수집한 후 실행 계산을 수행합니다. 따라서 나머지 실행 계획은 CN이 대부분의 계산을 수행합니다.

  • 적용 가능한 시나리오: 처음 3세대 조건을 충족하지 않는 시나리오는 거의 없으며 성능도 매우 낮습니다.

분산 아키텍처에서는 동일한 테이블의 데이터가 서로 다른 데이터 노드에 분산됩니다. 테이블을 생성할 때 각 테이블의 데이터를 해시하거나 무작위로 분산하도록 선택할 수 있습니다. 두 테이블의 조인 작업을 올바르게 수행하려면 두 테이블의 데이터를 재배포해야 할 수 있습니다. 따라서 GaussDB의 분산 실행 계획에서는 데이터를 특정 배포 방법으로 만드는 세 가지 Stream 연산자를 추가합니다.

7.png

그림 (7) 스트림 연산자

분산 경로를 생성할 때 두 테이블의 데이터와 연결 조건이 동일한 데이터 노드에 있는지 여부를 고려하고, 그렇지 않은 경우 해당 데이터 분산 연산자를 추가합니다. 재분배된 Stream 연산자는 DN 노드 간 데이터 흐름을 줄이는 원리에 따라 선택됩니다.

GaussDB가 분산 아키텍처에서 대규모 데이터를 처리하는 것이 가능한 것은 Stream 연산자의 합리적인 사용을 기반으로 합니다. 스트림 연산자의 최적화는 GaussDB 쿼리 최적화의 중요한 부분이기도 합니다.

8.png

그림 (8) GaussDB 분산 쿼리 최적화 기술

[ 핵심 기술 포인트 ] 분산 쿼리 최적화: 4개의 분산 실행 계획과 3개의 Stream 연산자.

액추에이터

Executor가 수신한 명령은 SQL 쿼리문에 대해 Optimizer가 생성한 실행 계획이며, 실행 계획은 일부 실행 연산자(Operator), 표현식 등으로 구성되며 주로 관계 집합에 대해 동작하여 최종적으로 사용자가 원하는 것을 출력합니다. 원하는 결과 세트. 다음은 몇 가지 일반적인 유형의 실행 연산자입니다.

1. 스캔 계획 노드

스캐닝 노드는 파일 시스템이나 네트워크에 있을 수 있는 기본 데이터 소스에서 데이터를 추출하는 역할을 합니다. 일반적으로 스캐닝 노드는 실행 트리의 리프 노드에 위치하며 실행을 위한 데이터 입력 소스 역할을 하며 일반적으로 SeqScan, IndexScan 및 SubQueryScan을 나타냅니다.

주요 기능: 입력 데이터, 리프 노드, 표현식 필터링

2. 제어 계획 노드

제어 연산자는 일반적으로 대수 연산자를 매핑하지 않지만 실행기가 Limit, RecursiveUnion 및 Union과 같은 일부 특수 프로세스를 완료하기 위해 도입된 연산자입니다.

주요 기능: 데이터 흐름을 제어하는 ​​데 사용됩니다.

3. 계획 노드 구체화

구체화된 연산자는 일반적으로 알고리즘 요구 사항을 참조하며, 연산자 논리 처리를 수행할 때 하위 계층의 데이터를 캐시해야 합니다. 왜냐하면 하위 계층 연산자가 반환하는 데이터의 양을 미리 예측할 수 없기 때문입니다. Agg, Sort와 같은 메모리 조건을 모두 배치할 수 없는 알고리즘입니다.

주요 기능: 반환하기 전에 모든 데이터를 스캔해야 합니다.

4. Join Plan 노드  연산자는 데이터베이스에서 가장 일반적인 연관 작업을 처리하도록 설계되었으며, 서로 다른 처리 알고리즘 및 데이터 입력 소스에 따라 MergeJoin, NestLoop Join 및 HashJoin으로 구분됩니다.

주요 기능: 관련 검색어

5. 기타 사업자

실행기의 아키텍처와 기술도 데이터베이스 쿼리 실행의 전반적인 운영 효율성을 결정합니다. GaussDB 실행 엔진은 최신 하드웨어 기술의 특성을 완벽하게 결합하고 효율적인 실행을 위해 벡터화 엔진 및 LLVM과 같은 다양한 최신 소프트웨어 기술을 사용합니다.

9.png

그림 (9) GaussDB 완전 병렬 실행 아키텍처

GaussDB는 또한 분산 계획 실행 중 쿼리 실행 성능을 향상시키기 위해 다양한 기술을 사용합니다. 예를 들어, 복잡한 쿼리를 실행할 때 재실행 연산자는 AGG 연산자와 같이 실행을 위해 DN 노드로 푸시다운됩니다. 푸시다운 연산자를 실행할 때 데이터의 집약성을 고려하여 최대한 로컬에서 계산을 수행하여 네트워크 내 데이터 전송 오버헤드를 줄입니다.

[핵심 기술 포인트] 완전 병렬 실행 아키텍처 : MPP, SMP, LLVM, SIMD 완전 병렬 실행, 시스템의 궁극적인 성능을 최대한 발휘하고 CPU 리소스를 최대한 활용하여 쿼리 성능을 향상시키는 기술을 전면적으로 소개합니다. 나중에 하나씩 병렬 실행.

궁금하신 점이나 핵심 기술 사항에 관심이 있으신 분들은 [윤카 Q&A]에서 GaussDB SQL 엔진의 미스터리를 공개하고, 서로 교류하며, 이벤트 게시물에 메시지를 남겨주시면 경품을 받으실 수 있으며, 전문가가 답변해 드립니다. 일대일로 질문하고, 질문에 대한 인센티브도 받을 수 있습니다.

화웨이 클라우드의 신기술에 대해 빨리 알아보고 팔로우하려면 클릭하세요~

 

Linus는 커널 개발자가 탭을 공백으로 대체하는 것을 막기 위해 문제를 직접 해결했습니다. 그의 아버지는 코드를 작성할 수 있는 몇 안 되는 리더 중 한 명이고, 둘째 아들은 오픈 소스 기술 부서의 책임자이며, 막내 아들은 핵심입니다. Huawei: 일반적으로 사용되는 모바일 애플리케이션 5,000개를 변환하는 데 1년이 걸렸습니다. Hongmeng으로의 포괄적인 마이그레이션 Java는 타사 취약점에 가장 취약한 언어입니다. Hongmeng의 아버지인 Wang Chenglu: 오픈 소스 Hongmeng은 유일한 아키텍처 혁신입니다. 중국 기초 소프트웨어 분야의 마화텅(Ma Huateng)과 저우홍이(Zhou Hongyi)가 악수를 하며 "원한을 풀다" 전 마이크로소프트 개발자: 윈도우 11 성능은 "터무니없을 정도로 나쁘다" 라오샹지가 오픈소스인 것은 코드는 아니지만 그 이유는 다음과 같다. Google이 대규모 구조 조정을 발표 했습니다 .
{{o.이름}}
{{이름}}

추천

출처my.oschina.net/u/4526289/blog/11054548