데이터 웨어하우스의 벡터화된 실행 엔진에 대한 자세한 설명

이 기사는 Huawei Cloud 커뮤니티 " GaussDB (DWS) 벡터화된 실행 엔진 세부 설명 ", 작성자: yd_212508532 에서 공유되었습니다 .

머리말

  • 적용 버전: [베이스라인 기능]

대부분의 기존 행 실행 엔진은 한 번에 하나의 튜플 실행 모드를 채택합니다. 이러한 방식으로 실행 프로세스 중 대부분의 시간 동안 CPU는 데이터를 처리하는 데 사용되지 않고 실행 트리를 순회하는 데 더 많이 사용됩니다. CPU의 효과적인 활용도가 낮아집니다. OLAP 시나리오에서는 엄청난 수의 함수 호출이 발생하므로 막대한 오버헤드가 필요합니다. 이 문제를 해결하기 위해 GaussDB(DWS)에 벡터화 엔진을 추가했습니다. 벡터화 엔진은 튜플의 한 번에 일괄 실행 모드를 사용하므로 실행 노드를 순회하는 비용을 크게 줄일 수 있습니다. 동시에 벡터화 엔진은 열 저장소에도 자연스럽게 연결되어 기본 스캐닝 노드에 벡터화된 열 데이터를 더 쉽게 로드할 수 있습니다. 컬럼 스토리지 + 벡터화된 실행 엔진은 OLAP 성능의 문을 여는 황금 열쇠 중 하나입니다!

행 저장 및 열 저장 테이블 정보

행 저장 테이블은 튜플을 행별로 페이지 페이지에 저장합니다. 이는 데이터가 자주 업데이트되고 추가, 삭제 및 수정이 많으며 쿼리 결과에 테이블의 여러 열이 포함되는 TP 시나리오에서 주로 사용됩니다.

행 저장 테이블 저장 방법

컬럼 저장 테이블은 컬럼에 저장되며, 각 컬럼의 데이터는 파일에 저장됩니다. AP 시나리오에서 주로 사용됩니다.

  • 테이블 열 수는 많고, 액세스되는 열 수는 적으며, IO 작업 수가 줄어듭니다.
  • 컬럼 데이터가 동질화되어 데이터 압축률 향상
  • 컬럼 배치 데이터 기반 연산, CPU 캐시 적중률이 높음

컬럼 저장 테이블 저장 방식

실행 프레임워크

실행기는 최적화 프로그램과 스토리지 엔진 간의 상호 작용 허브입니다. 옵티마이저에서 생성된 실행 계획 트리를 입력으로 스토리지 엔진에서 데이터에 접근하고, 그 계획에 따라 다양한 실행 연산자가 동작하여 데이터 처리를 구현한다. 파이프라인 모드를 사용하면 행 실행기는 한 번에 하나의 튜플을 작동하고 열 실행기는 한 번에 하나의 배치를 작동합니다. 상위 계층은 하위 계층을 구동하여 데이터가 실행 트리 위로 흐를 수 있도록 합니다. 다양한 데이터 처리를 위한 실행 연산자를 제공합니다. 아래 그림은 하향식 제어 흐름과 상향식 데이터 흐름을 보여줍니다.

실행기의 파이프라인 모드

Executor의 실행 프로세스는 다음 세 단계로 나눌 수 있습니다.

  1. 실행자 초기화: 실행자의 전역 상태 정보 공간을 구성하고, 계획 트리의 각 노드를 재귀적으로 순회하고, 실행 상태 정보 planstate를 초기화합니다.
  2. 실행기 실행: 행 엔진과 벡터화 엔진의 입구는 독립적입니다. 계획 트리의 루트 노드에서 시작하여 레이어별로 처리한 후 리프 노드로 재귀적으로 이동합니다. 노드 연산자의 경우 더 이상 튜플/배치가 없을 때까지 결과 튜플/배치가 반환됩니다.
  3. 실행기 정리: 실행기의 전역 상태 정보를 재활용하고 각 계획 노드의 실행 상태를 정리합니다.

Executor의 실행 과정

컬럼 실행자

행 실행기의 문제점은 대부분의 CPU 처리가 실제로 데이터를 처리하는 대신 Plan Tree를 순회하는 과정에서 이루어지며, 효과적인 CPU 활용도가 낮다는 것입니다. 열 저장 테이블의 고유한 애플리케이션 시나리오에는 OLAP 시나리오에서 성능 향상을 실제로 활용하기 위한 지원 벡터화 엔진이 필요합니다. 따라서 컬럼 실행기 변환의 기본 아이디어는 한 번에 하나의 데이터 열을 처리하는 것입니다.

행 실행기와 마찬가지로 벡터화된 실행 엔진 스케줄러는 파이프라인 모드를 따르지만 각 처리 및 연산자 간의 데이터 전송은 한 번에 하나의 배치(즉, 1000행의 데이터)이므로 CPU 적중률이 향상되고 IO 읽기 작업이 줄어듭니다. . 컬럼 실행기 VectorBatch의 데이터 흐름 구조는 아래 그림과 같습니다.

열 실행자 데이터 흐름 구조 VectorBatch

행과 열 혼합: 어댑터 연산자

열 스토리지 테이블의 일부 시나리오는 string_to_array, listagg, string_agg 등과 같은 벡터화된 실행 엔진을 지원하지 않습니다.
GaussDB에는 두 세트의 행 및 열 엔진 간에 자동으로 전환하는 기능이 있습니다.

행 및 열 엔진의 자동 전환

열 저장 데이터의 경우 행 엔진만 있는 경우 일반적으로 실행 엔진이 행별로 처리할 수 있도록 열 데이터를 튜플로 재구성해야 합니다. 튜플 변형 프로세스는 열 저장소 데이터 쿼리 처리 성능에 영향을 미칩니다.

벡터화된 실행 엔진 성능

행 및 열 저장 엔진에 의한 동일한 표현식 x*(1-y)의 계산 성능을 비교하면 열 저장 엔진의 Cstore Scan 연산자가 행 저장의 Seq Scan 연산자보다 85% 더 적은 시간이 소요되는 것을 확인할 수 있습니다. 엔진.

행/열 엔진 성능 비교

벡터 컴퓨팅의 특징은 한 번에 여러 값을 계산하고, 함수 호출 및 컨텍스트 전환을 줄이고, CPU 캐시 및 벡터화된 실행 명령을 최대한 활용하여 성능을 향상시키는 것입니다.

벡터화된 실행 엔진의 성능 이점:

  • 한 번에 하나의 배치로 더 많은 데이터를 읽고 IO 읽기 수를 줄입니다.
  • Batch의 레코드 수가 많아 해당 CPU의 캐시 적중률이 증가합니다.
  • 파이프라인 모드 실행 중 함수 호출 수가 줄어듭니다.
  • 튜플 변형, 즉 열 저장소 데이터에서 튜플을 재구성하는 시간 오버헤드를 줄이기 위해 열 저장소 테이블과 일치합니다.

행/열 실행기의 연산자 비교

벡터화 엔진의 실행 연산자는 제어 연산자, 스캔 연산자, 구체화 연산자 및 연결 연산자를 포함하여 행 실행 엔진과 유사합니다. 또한 행 실행 노드에서 상속된 노드로 표시되며 실행 프로세스는 재귀적입니다. 포함된 주요 노드는 CStoreScan(순차 스캔), CStoreIndexScan(인덱스 스캔), CStoreIndexHeapScan(튜플을 얻기 위해 비트맵 사용), VecMaterial(구체화), VecSort(정렬), VecHashJoin(벡터화된 해시 연결) 등입니다. 아래에서 하나씩 설명하겠습니다.

스캔 오퍼레이터

스캔 연산자는 테이블의 데이터를 스캔하는 데 사용되며 상위 노드의 입력으로 튜플을 얻을 때마다 쿼리 계획 트리의 리프 노드에 존재하여 테이블을 스캔할 수 있을 뿐만 아니라 함수의 결과 집합, 연결된 목록 구조 및 쿼리 결과 집합을 검색합니다. 보다 일반적인 스캔 연산자 중 일부가 표에 나와 있습니다.

연산자(행/열 저장 연산자) 의미 장면 등장
SeqScan/CStoreScan 순차 스캔 물리적 테이블을 스캔하는 데 사용되는 가장 기본적인 스캔 연산자(인덱스 지원 없이 순차 스캔)
IndexScan/CStoreIndexScan 인덱스 스캔 선택 기준과 관련된 속성에 대한 색인이 생성됩니다.
IndexOnlyScan/CStoreIndexOnlyScan 인덱스에서 직접 튜플 반환 인덱스 열은 결과 집합 열을 완전히 포함합니다.
BitmapScan(BitmapIndexScan, BitmapHeapScan) / CStoreIndexHeapScan(CStoreIndexAnd, CStoreIndexOr,CStoreIndexCtidScan) 비트맵을 사용하여 튜플 얻기 BitmapIndexScan은 속성의 인덱스를 사용하여 스캔하고 결과를 비트맵으로 반환합니다. BitmapHeapScan은 BitmapIndexScan의 비트맵 출력에서 ​​튜플을 얻습니다.
TidScan 튜플 tid로 튜플 가져오기 1.WHERE 조건(예: CTID = tid 또는 CTID IN (tid1, tid2, …)) ;2.UPDATE/DELETE … 커서의 현재 위치
하위 쿼리 스캔/VecSubqueryScan 하위 쿼리 스캔 튜플을 검색하려면 다른 쿼리 계획 트리(하위 계획)를 검색 개체로 사용하세요.
기능Scan 기능 스캔 FROM function_name
ValuesScan 값 연결 목록 스캔 VALUES 절에 의해 제공된 튜플 컬렉션을 스캔합니다.
ForeignScan/VecForeignScan 외부 테이블 스캔 외부 테이블 쿼리
CteScan/VecCteScan CTE 테이블 스캔 SELECT 쿼리에서 WITH 절로 정의된 하위 쿼리 검사

연결 연산자

조인 연산자는 관계형 대수학의 조인 연산에 해당합니다. 테이블 t1 조인 t2를 예로 들면 주요 중앙 조인 유형은 내부 조인, 왼쪽 조인, 오른쪽 조인, 전체 조인, 세미 조인, 안티 조인 등입니다. 구현 방법에는 Nestloop, HashJoin, MergeJoin이 포함됩니다 .

연산자(행/열 저장 연산자) 의미 장면 등장
NestLoop/VecNestLoop 중첩 루프 연결, 폭력 연결, 각 행에 대해 내부 테이블 스캔 내부 조인, 왼쪽 외부 조인, 세미 조인, 안티 조인
MergeJoin/VecMergeJoin 연결 병합(입력 순서), 내부 및 외부 테이블 정렬, 첫 번째 및 마지막 끝 위치 지정, 튜플 연결을 한 번에 수행합니다. 에퀴조인 내부 조인, 왼쪽 외부 조인, 오른쪽 외부 조인, 전체 외부 조인, 세미 조인, 안티 조인
HashJoin/VecHashjoin 해시 조인은 내부 테이블과 외부 테이블이 조인 열의 해시 값을 사용하여 해시 테이블을 생성하며, 동일한 값이 동일한 해시 버킷에 있어야 합니다. 에퀴조인 내부 조인, 왼쪽 외부 조인, 오른쪽 외부 조인, 전체 외부 조인, 세미 조인, 안티 조인

구체화 연산자

구체화된 연산자는 튜플을 캐시할 수 있는 노드 유형입니다. 실행 중에 많은 확장된 물리 연산자는 작동하기 전에 먼저 모든 튜플을 얻어야 합니다(예: 집계 함수 작업, 인덱스 지원 없이 정렬 등). 이를 위해서는 튜플을 캐시하기 위해 구체화 연산자를 사용해야 합니다.

연산자(행/열 저장 연산자) 의미 장면 등장
재료/Vec재료 구체화하다 캐시 하위 노드 결과
정렬/Vec정렬 종류 ORDER BY 절, 연결 연산, 그룹화 연산, 집합 연산, 고유
그룹/Vec그룹 그룹화 작업 GROUP BY 어구
Agg/Vec집계 집계 함수 실행 1. COUNT/SUM/AVG/MAX/MIN과 같은 집계 함수 2. DISTINCT 절 3. 중복을 제거하는 UNION 4. GROUP BY 절
WindowAgg/VecWindowAgg 창 기능 WINDOW 절
고유/Vec고유 중복 제거(하위 수준이 정렬됨) 1. DISTINCT 절 2. UNION 중복 제거
해시시 HashJoin 도우미 노드 해시 테이블 구축 및 HashJoin과 협력
SetOp/VecSetOp 수집 작업 처리 교차/모두 교차, 모두 제외/모두 제외
LockRows 행 수준 잠금 처리 공유/업데이트를 위해 선택하세요.

제어 연산자

제어 연산자는 특별한 상황을 처리하고 특별한 실행 프로세스를 구현하는 데 사용되는 노드 유형입니다.

연산자(행/열 저장 연산자) 의미 장면 등장
결과/VecResult 직접 계산 1. 테이블 스캔을 포함하지 않습니다. 2. INSERT 문에 VALUES 절이 하나만 있습니다. 3. Append/MergeAppend가 계획 루트 노드인 경우(프로젝션 푸시업)
테이블 수정 INSERT/UPDATE/DELETE 상위 노드 삽입/업데이트/삭제
추가/Vec추가 추가 1. UNION(ALL) 2. 상속 테이블
병합추가 추가(입력 순서) 1. UNION(ALL) 2. 상속 테이블
RecursiveUnion WITH 절에 재귀적으로 정의된 UNION 하위 쿼리 처리 WITH RECURSIVE … SELECT … 문
비트맵과 비트맵 논리 AND 연산 다차원 인덱스 스캐닝을 위한 BitmapScan
비트맵또는 비트맵 논리 OR 연산 다차원 인덱스 스캐닝을 위한 BitmapScan
한도/VecLimit LIMIT 절 처리 오프셋 ... 한계 ...

기타 운영자

다른 연산자 로는 Stream 연산자 및 RemoteQuery와 같은 연산자가 있습니다.

연산자(행/열 저장 연산자) 의미 장면 등장
개울 다중 노드 데이터 교환 분산 쿼리 계획을 실행하고 노드 간 데이터 교환이 있습니다.
파티션 반복자 분할된 반복자 파티션 테이블 스캔, 각 파티션을 반복적으로 스캔
VecToRow/RowToVec 열에서 행으로/행에서 열로 계급과 계급이 혼합된 장면
DfsScan / DfsIndexScan HDFS 테이블(인덱스) 스캔 HDFS 테이블 스캔

Gaussdb 벡터화의 진화

1세대 벡터화 엔진 이후 GaussDB는 더 높은 성능의 벡터화 엔진인 음파 벡터화 엔진과 터보 벡터화 엔진을 발전시켰습니다.
OLAP 실행 성능을 향상시키기 위해 GaussDB는 열 저장 + 벡터화된 실행 엔진 및 배치 계산의 방향으로 계속 발전하고 있습니다.

  • 스트림 연산자 + 분산 실행 프레임워크는 여러 노드 간의 데이터 흐름을 지원합니다.
  • 노드 내 다중 스레드 병렬 처리인 SMP는 유휴 하드웨어 리소스를 최대한 활용합니다.
  • 새로운 코드 생성 프레임워크인 JIT(Just In Time) 컴파일러인 LLVM 기술은 튜플 변형 병목 현상을 제거합니다.
  • Sonic 벡터화 엔진은 HashAgg 및 HashJoin 연산자를 추가로 벡터화하고 다양한 배열을 구현하여 각 열의 다양한 유형에 따라 데이터를 계산합니다.
  • 차세대 터보 벡터화 엔진은 대부분의 연산자를 더욱 벡터화합니다. Sonic 엔진을 기반으로 Null 최적화, 큰 정수 최적화, 스트림 최적화, 정렬 최적화 등이 추가되어 성능이 더욱 향상됩니다.

요약하다

이 글에서는 GaussDB 벡터화 실행 엔진을 소개하고, 그 프레임워크, 원리, 각 연산자의 개요, 성능 개선에 대해 자세히 설명합니다.

 

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

 

오픈 소스 Hongmeng을 포기하기로 결정했습니다 . 오픈 소스 Hongmeng의 아버지 Wang Chenglu: 오픈 소스 Hongmeng은 중국에서 유일하게 기초 소프트웨어 분야의 건축 혁신 산업 소프트웨어 행사입니다. OGG 1.0이 출시되고 Huawei는 모든 소스 코드를 제공합니다. 구글 리더가 '코드 똥산'에 죽는다 페도라 리눅스 40 정식 출시 전 마이크로소프트 개발자: 윈도우 11 성능이 ' 어처구니없을 정도로 나쁨' 마화텡과 저우홍이가 악수하며 '원한 해소' ​​유명 게임사들이 새로운 규정 발표 : 직원 결혼 선물은 100,000위안을 초과할 수 없습니다. Ubuntu 24.04 LTS 공식 출시 Pinduoduo는 부정 경쟁 혐의로 판결을 받았습니다. 보상금 500만 위안
{{o.이름}}
{{이름}}

추천

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